【问题标题】:JLabel wont change color twiceJLabel 不会改变颜色两次
【发布时间】:2011-01-30 00:59:03
【问题描述】:

我有以下代码:

   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,但当我再次单击它时,我看不到颜色发生任何变化。有谁知道为什么?

谢谢

【问题讨论】:

    标签: java user-interface swing colors jlabel


    【解决方案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!
    

    【讨论】:

    • 这是正确的,因为我使用的是半透明颜色,因此 Swing 在提供 JLabel 之前不会绘制它下面的组件
    【解决方案2】:

    这是你必须使用的代码

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

    【讨论】:

      【解决方案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 和小于传递给它的值之间的值。所以

      index % COLORS.length
      

      将始终返回一个介于 0 和 COLORS.length -1 之间的值。

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

      【讨论】:

      • 查看我新添加的 actionPerformed 方法。
      【解决方案4】:

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

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

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

      顺便说一句。创建Color 时不必使用new Float(1)1F 也应该可以。

      【讨论】:

      • 酷,我已经编辑了包含 index++ 的代码,但仍然无法正常工作
      猜你喜欢
      • 2011-06-15
      • 2013-03-27
      • 2013-03-30
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多