JLabel changer la couleur deux fois wont
-
21-09-2019 - |
Question
Je le code suivant:
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 cours, je reçois 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 à nouveau, je ne vois pas de changement de couleur. Est-ce que quelqu'un sait pourquoi?
Merci
La solution
Vous faites fausse route. 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!
Autres conseils
Eh bien, qu'est-ce qu'on vous attend arriver?
label.setBackground(COLORS[index % (COLORS.length - 1)]);
La variable d'index est codé en dur à 0. et COLORS.length -1 est essentiellement 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 à vous suivre l'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++;
}
}
D'abord: L'opérateur modulo renvoie toujours une valeur comprise entre 0 et une inférieure à la valeur qui lui est passé. Donc,
index % COLORS.length
renvoie toujours une valeur comprise entre 0 et -1 COLORS.length.
Deuxième: Vous oubliaient pour augmenter l'indice après chaque appel
.Hey! Vous avez oublié d'augmenter l'indice. Dans cette expression:
label.setBackground(COLORS[index % (COLORS.length - 1)]);
index % (COLORS.length - 1)
est toujours 0.
BTW. vous ne devez pas utiliser new Float(1)
lors de la création Color
. 1F
devrait fonctionner aussi.
Voici le code que vous devez utiliser
label.setBackground(COLORS[index % (COLORS.length)]);
index++;