变化的背景上移动的JLabel组件
-
21-09-2019 - |
题
我使用的代码是:
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看起来像这样:
任何想法,为什么?
解决方案
您给JLabel的背景是半透明的,但你已经指定它是不透明的。这意味着,秋千不会画下它的组件提供了一个JLabel之前与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);
}
}
其他提示
背景随着透明度为您提供接受了溶液的,但还提供了一个解决方案可以不延长的JLabel使用,这可能是感兴趣的。
不隶属于 StackOverflow