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

Était-ce utile?

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++;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top