我使用的代码是:
public class Test extends JFrame implements ActionListener {
private static final Color TRANSP_WHITE =
new Color(new Float(1), new Float(1), new Float(1), new Float(0.5));
private static final Color TRANSP_RED =
new Color(new Float(1), new Float(0), new Float(0), new Float(0.1));
private static final Color[] COLORS =
new Color[]{TRANSP_RED, TRANSP_WHITE};
private int index = 0;
private JLabel label;
private JButton button;
public Test() {
super();
setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
label = new JLabel("hello world");
label.setOpaque(true);
label.setBackground(TRANSP_WHITE);
getContentPane().add(label);
button = new JButton("Click Me");
button.addActionListener(this);
getContentPane().add(button);
pack();
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(button)) {
label.setBackground(COLORS[index % (COLORS.length)]);
index++;
}
}
public static void main(String[] args) {
new Test();
}
}
当我单击按钮更改labales颜色时,GUI如下所示:
在: alt text http://www.freeimagehosting.net/uploads/67d741157b.png 后: alt text http://www.freeimagehosting.net/uploads/5cc86874fa.png
任何想法为什么?
答案 0 :(得分:4)
您正在为JLabel提供半透明的背景,但您已指定它是不透明的。这意味着在向JLabel提供用于绘图的Graphics对象之前,Swing不会在其下绘制组件。提供的Graphics包含它希望JLabel在绘制背景时覆盖的垃圾。然而,当它绘制背景时,它是半透明的,所以垃圾仍然存在。
要解决此问题,您需要创建一个JLabel的扩展,该扩展不是不透明的,但有一个重写的paintComponent方法,它将绘制您想要的背景。
编辑:这是一个例子:public class TranslucentLabel extends JLabel {
public TranslucentLabel(String text) {
super(text);
setOpaque(false);
}
@Override
protected void paintComponent(Graphics graphics) {
graphics.setColor(getBackground());
graphics.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(graphics);
}
}
答案 1 :(得分:3)
Backgrounds With Transparency提供了您接受的解决方案,但也为您提供了一个解决方案,您可以使用它而不需要扩展JLabel,这可能是您感兴趣的。