2010-03-21 93 views
0

我有以下代码:的JLabel不会改变颜色两次

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但是当我点击它我再次看到颜色没有变化。有谁知道为什么?

谢谢

回答

1

你做错了使用的代码。它应该做的那样

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! 
+0

这是正确的,因为我使用半透明颜色,因此在提供JLabel之前Swing不会绘制它下面的组件 – Aly 2010-03-21 16:15:16

3

那么,你期望发生什么?

label.setBackground(COLORS[index % (COLORS.length - 1)]); 

索引变量被硬编码为0,而COLORS.length -1本质上是一个常量。所以每次点击设置COLORS [0]的背景;

如果你改变你的操作方法下面,你会得到你所希望的结果:

@Override 
public void actionPerformed(ActionEvent e) { 
    if(e.getSource().equals(button)){ 
    label.setBackground(COLORS[index % COLORS.length]); 
    index++; 
    } 
} 

第一:模运算符将始终返回0和1之间的值小于传递的值到它。所以

index % COLORS.length 

将始终返回0和COLORS.length -1之间的值。

第二:在每次调用之后忘记增加索引。

+0

哎呀,但仍然无法正常工作我已经编辑上面 – Aly 2010-03-21 13:41:52

+0

代码见我新加入的actionPerformed方法。 – 2010-03-21 13:46:10

2

嘿!你忘了增加索引。在此表达式中:

label.setBackground(COLORS[index % (COLORS.length - 1)]); 

index % (COLORS.length - 1)始终为0。

顺便说一句。创建Color时,您不必使用new Float(1)1F也应该工作。

+0

很酷,我已经编辑了代码来包含索引++,但仍然不起作用 – Aly 2010-03-21 13:43:12

2

这里是你有

label.setBackground(COLORS[index % (COLORS.length)]);
index++;