2010-03-21 7 views
0

Je le code suivant:JLabel wont changer de couleur deux fois

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(); 
} 
    } 

Quand je le lance-je obtenir l'étiquette avec l'arrière-plan TRANSP_WHITE et puis quand je clique sur le bouton de cette couleur change à TRANSP_RED mais quand je clique dessus encore une fois je ne vois aucun changement de couleur. Quelqu'un sait-il pourquoi?

Merci

Répondre

1

Vous le faites mal. Il devrait se faire comme ça

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

Ceci est correct car j'utilise des couleurs translucides, donc Swing ne peindra pas les composants en dessous avant de fournir le JLabel – Aly

3

Eh bien, ce que vous attendiez de se produire?

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

La variable d'index est codée en dur à 0. et COLORS.length -1 est essentiellement une constante. Donc, chaque fois que vous cliquez sur votre réglage de l'arrière-plan à COULEURS [0];

Si vous changez de méthode d'action au vous suivre vous obtiendrez les résultats que vous recherchez:

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

Première: L'opérateur modulo vaudra toujours une valeur comprise entre 0 et une inférieure à la valeur passée à lui. Donc

index % COLORS.length 

Renvoie toujours une valeur entre 0 et COLORS.length -1. Deuxièmement: Vous avez oublié d'incrémenter l'index après chaque appel.

+0

oups, mais le code ne fonctionne toujours pas que j'ai édité ci-dessus – Aly

+0

Voir ma méthode actionPerformed nouvellement ajouté. –

2

Hey! Vous avez oublié d'incrémenter l'index. Dans cette expression:

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

index % (COLORS.length - 1) est toujours 0.

BTW. vous n'avez pas besoin d'utiliser new Float(1) lors de la création de Color. 1F devrait fonctionner aussi.

+0

cool, j'ai modifié le code pour inclure index ++ mais ne fonctionne toujours pas – Aly

2

Voici le code que vous devez utiliser

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