2010-03-21 92 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++;