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 - 1)]);
index++;
}
}
public static void main(String[] args) {
new Test();
}
}
当我运行它,我得到与TRANSP_WHITE
背景标签,然后当我点击这个按钮的颜色变化来TRANSP_RED
但是当我再次点击它,我看到的颜色没有变化。有谁知道为什么?
由于
解决方案
您这样做是错误的。应该这样来完成
label = new JLabel("hello world"){
public void paintComponent(Graphics g)
{
//draw background
Color old=g.getColor();
g.setColor(getBackground());
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(old);
super.paintComponent(g);
}
};
label.setOpaque(false); // your component is not opaque!
其他提示
那么,什么是你期待发生什么?
label.setBackground(COLORS[index % (COLORS.length - 1)]);
的索引变量被硬编码为0和COLORS.length -1基本上是一个常数。所以每次你点击你的设置背景颜色[0];
如果你改变你的操作方法下面,你会得到你所希望的结果:
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(button)){
label.setBackground(COLORS[index % COLORS.length]);
index++;
}
}
第一:模运算将始终比之间传递给它的值小于0和一个返回值。所以
index % COLORS.length
将始终为0和COLORS.length之间返回一个值-1。
二:你忘了每次调用后递增指数
。喂!你忘了增量指标。在此表达式中:
label.setBackground(COLORS[index % (COLORS.length - 1)]);
index % (COLORS.length - 1)
始终为0。
顺便说一句。你没有创建new Float(1)
时使用Color
。 1F
应太
下面是必须使用的代码
label.setBackground(COLORS[index % (COLORS.length)]);
index++;
不隶属于 StackOverflow