2011-12-03 22 views
3

У меня есть JLabel в JFrame с полупрозрачным фоном, но я получаю некоторые артефакты вокруг букв.Артефакты на прозрачном фоне

Screenshot of the Artifacts

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.io.IOException; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Main { 
    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     JLabel label = new JLabel("Hello World!"); 
     frame.setPreferredSize(new Dimension(200, 200)); 
     frame.setUndecorated(true); 
     frame.setBackground(new Color(128, 128, 128, 128)); 
     //label.setOpaque(false); 
     //label.setBackground(new Color(0, 0, 0, 0)); 
     //((JPanel) frame.getContentPane()).setOpaque(false); 
     //((JPanel) frame.getContentPane()).setBackground(new Color(0, 0, 0, 0)); 
     frame.add(label); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

Я уже пытался применять непрозрачность этих компонентов без удачи. Я бы хотел, чтобы все компоненты были полностью непрозрачными, поэтому прозрачность java7 для пикселя для JFrame кажется единственным решением.

ответ

6

Вы не можете просто использовать Цвета с прозрачностью в качестве фона. См. Background With Transparency для объяснения и возможного решения.

+0

Это сообщение относится к повторному использованию цветов фона и поэтому становится все более и более непрозрачным, но не касается артефактов вокруг букв. – NCode

+0

@NCode Публикация связана с ответственностью компонента с непрозрачным свойством, гарантирующим полную окраску фона компонента. Когда вы используете прозрачный цвет на непрозрачном компоненте, у вас могут возникнуть проблемы с живописью. В проводке дается «пример» того, что может произойти. Это не ограничивает проблемы с живописью. – camickr

2

Я не могу воспроизвести вашу проблему, может быть, я отключаю аккумулятор, но нет ли какой-то проблемы с вашим GPU ???

enter image description hereenter image description here

Я попытался предложение по @camickr, ничего плохого не произошло

enter image description here

и

enter image description here

на основе кода из учебника How to Create Translucent and Shaped Windows

import java.awt.*; 
import javax.swing.*; 

public class TranslucentWindow extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public TranslucentWindow() { 
     super("Test translucent window"); 
     this.setLayout(new FlowLayout()); 
     this.add(new JButton("test")); 
     this.add(new JCheckBox("test")); 
     this.add(new JRadioButton("test")); 
     this.add(new JProgressBar(0, 100)); 
     JPanel panel = new JPanel() { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(400, 300); 
      } 
      private static final long serialVersionUID = 1L; 

      @Override 
      protected void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       g.setColor(Color.red); 
       g.fillRect(0, 0, getWidth(), getHeight()); 
      } 
     }; 
     panel.add(new JLabel("Very long textxxxxxxxxxxxxxxxxxxxxx ")); 
     this.add(panel); 
     this.setSize(new Dimension(400, 300)); 
     this.setLocationRelativeTo(null); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

    public static void main(String[] args) { 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       Window w = new TranslucentWindow(); 
       w.setVisible(true); 
       com.sun.awt.AWTUtilities.setWindowOpacity(w, 0.7f); 
      } 
     }); 
    } 
} 
+0

Есть две проблемы: 1. Вы используете старые AWTUtilities, которые стали непригодными для использования Java 7, поэтому вы должны использовать Window.setOpacity (...), но 2. обе функции устанавливают глобальную прозрачность, я хочу только фон чтобы стать прозрачными, Компоненты должны быть полностью непроницаемыми. – NCode

Смежные вопросы