代码之家  ›  专栏  ›  技术社区  ›  Aly

JLabel不会改变颜色两次

  •  0
  • Aly  · 技术社区  · 16 年前

       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 回复  |  直到 16 年前
        1
  •  1
  •   Ha.    16 年前

    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!
    
        2
  •  3
  •   Jason Nichols    16 年前

    你以为会发生什么?

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

    索引变量硬编码为0,COLORS.length-1本质上是一个常量。所以每次你点击你的设置背景颜色[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之间的值。

    第二:你忘了在每次调用后增加索引。

        3
  •  2
  •   pajton    16 年前

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

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

    index % (COLORS.length - 1)

    顺便说一句,你不必使用 new Float(1) 创建时 Color . 1F 应该也行。

        4
  •  2
  •   Samurai    16 年前

    这是你必须使用的代码

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