我正在制作代表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上有类似的问题,请查看已检查的答案,了解如何解决此问题。
答案 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可用于所有按钮。无需为每个按钮创建一个新实例。