如何在点击按钮后更改jbutton的颜色?

时间:2014-04-04 14:47:03

标签: java swing jframe jbutton actionlistener

我正在制作代表go board的jFrame。我想点击一个给定的按钮来改变颜色,以表示在棋盘上放置一块。在下面的代码中,我展示了一个应该能够改变按钮颜色的方法(它只会改变整个框架的背景)。第一个问题:为什么按钮颜色没有变化(这不是我在点击发生后改变颜色的更大问题,我的初步问题是按钮颜色不会改变)。我没有任何错误,按钮颜色永远不会改变。

public static void showBoard()
{
    JFrame frame2 = new JFrame("Go Board");
    frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    for(int i = 19*19; i > 0; i--)
    {
      JButton firstButton = new JButton("");

      firstButton.setBackground(Color.blue);
      firstButton.setVisible(true);
      firstButton.setContentAreaFilled(true);
      firstButton.setOpaque(true);

      firstButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
        {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() 
            {
              System.out.println("ddsd");
              //int[] arr = findMove(0);
            }
          });
        }
      });
      frame2.getContentPane().add(firstButton);
    }
    frame2.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
    frame2.setLayout(new GridLayout(19,19));
    frame2.pack();
    frame2.setVisible(true);
}

我的第二个问题,点击后按钮改变颜色,可能是因为我甚至无法改变按钮颜色。要在单击后让按钮更改颜色,我计划将按钮颜色更改代码放在动作侦听器中。

总而言之,如何在点击后更改按钮的颜色?

解答:

问题是我的Mac的外观和感觉。如果你的mac上有类似的问题,请查看已检查的答案,了解如何解决此问题。

1 个答案:

答案 0 :(得分:3)

您无需在SwingUtilities.invokeLater内调用ActionListener,因为actionPerformed(ActionEvent)方法已在事件线程上调用。

以下示例演示了如何在单击按钮时更改按钮的背景颜色:

public class ChangeButtonColor implements Runnable {
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel());
        } catch (UnsupportedLookAndFeelException e) {
            System.err.println("Cannot set LookAndFeel");
        }
        SwingUtilities.invokeLater(new ChangeButtonColor());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame();
        frame.setLayout(new FlowLayout());

        JButton button1 = new JButton("click me");
        JButton button2 = new JButton("click me too");
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Object source = e.getSource();
                if (source instanceof Component) {
                    ((Component)source).setBackground(Color.RED);
                }
            }
        };
        button1.addActionListener(listener);
        button2.addActionListener(listener);

        frame.add(button1);
        frame.add(button2);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}

请注意,此处使用的ActionListener可用于所有按钮。无需为每个按钮创建一个新实例。