JLabel不会改变颜色两次

时间:2010-03-21 13:21:39

标签: java user-interface swing colors 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,但当我再次点击它时,我看到颜色没有变化。有谁知道为什么?

由于

4 个答案:

答案 0 :(得分: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之间的值。

第二:你在每次通话后忘记增加索引。

答案 1 :(得分:2)

喂!你忘了增加索引。在这个表达式中:

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

index % (COLORS.length - 1)始终为0.

顺便说一句。创建new Float(1)时,您不必使用Color1F也应该有用。

答案 2 :(得分:2)

以下是您必须使用的代码

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

答案 3 :(得分: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!