JLabel не изменит цвет дважды - PullRequest
0 голосов
/ 21 марта 2010

У меня есть следующий код:

   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, но когда я нажимаюэто снова я не вижу изменений в цвете.Кто-нибудь знает почему?

Спасибо

Ответы [ 4 ]

3 голосов
/ 21 марта 2010

Ну, а что вы ожидали?

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 до единицы меньше значения, переданного ему.Так что

index % COLORS.length

всегда будет возвращать значение от 0 до COLORS.length -1.

Второе: вы забыли увеличить индекс после каждого вызова.

2 голосов
/ 21 марта 2010

Вот код, который вы должны использовать

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

2 голосов
/ 21 марта 2010

Эй! Вы забыли увеличить индекс. В этом выражении:

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

index % (COLORS.length - 1) всегда равно 0.

КСТАТИ. вам не нужно использовать new Float(1) при создании Color. 1F тоже должно работать.

1 голос
/ 21 марта 2010

Вы делаете это неправильно.Это должно быть сделано так

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!
...