Java 临时更改JButton背景色?

Java 临时更改JButton背景色?,java,swing,jbutton,Java,Swing,Jbutton,我对Java非常陌生,需要一些帮助。 我正在制作一个小型java桌面应用程序,其中我基本上有一个由4个按钮组成的网格(2 x 2网格),我需要更改各个按钮的背景颜色,一秒钟后,更改回原始颜色(我尝试制作的游戏类似于Simon,你必须按照点亮的按钮模式进行操作)。 我有一个向量,包含随机生成的数字,范围在1到4之间,我希望能够从向量中获取每个元素,并获得相应的按钮,以在一秒钟内更改为不同的颜色(例如,如果向量包含2 4 1,我希望按钮2更改,然后按钮4更改,然后按钮1更改) 这是可能的,还是有更好

我对Java非常陌生,需要一些帮助。 我正在制作一个小型java桌面应用程序,其中我基本上有一个由4个按钮组成的网格(2 x 2网格),我需要更改各个按钮的背景颜色,一秒钟后,更改回原始颜色(我尝试制作的游戏类似于Simon,你必须按照点亮的按钮模式进行操作)。 我有一个向量,包含随机生成的数字,范围在1到4之间,我希望能够从向量中获取每个元素,并获得相应的按钮,以在一秒钟内更改为不同的颜色(例如,如果向量包含2 4 1,我希望按钮2更改,然后按钮4更改,然后按钮1更改)

这是可能的,还是有更好的方法来实现这一点,而不是使用jbutton?我如何实现这一点

另外,我正在运行MacOSX,这显然(基于我在论坛上读到的一些东西)不喜欢JButtons背景的改变(我认为这是因为系统的外观和感觉),我如何改变它使其在Mac上工作

提前感谢您的帮助:)

一种方法是扩展并覆盖
paintComponent()
以显示颜色。一个
javax.swing.Timer
可以控制定时。这里有一个更详细的例子

一种方法是扩展并覆盖
paintComponent()
以显示颜色。一个
javax.swing.Timer
可以控制定时。这里有一个更详细的例子


您只需使用setBackground(…)方法设置颜色,然后在触发背景时使用Swing计时器重置背景

编辑:


如果您的问题是setBackground()方法在某些LAF上不起作用,那么您可以在按钮上添加一个简单的纯色图标。然后,要更改背景颜色,只需更改图标。

您可以使用setBackground(…)方法设置颜色,然后在背景触发时使用摆动计时器重置背景

编辑:


如果您的问题是setBackground()方法在某些LAF上不起作用,那么您可以在按钮上添加一个简单的纯色图标。然后,只需更改图标即可更改背景色。

出于您的目的,您不必使用
按钮。您可以使用
JLabels
JPanels

在初始化过程中,您可以在每个鼠标上设置其颜色,并在每个鼠标上添加一个鼠标侦听器以检测单击

要刷新Simon模式,请创建一个每秒触发一次的
javax.swing.Timer
。(如果1秒看起来很长,您可能需要配置延迟。)为简单起见,计时器可以在所有
JLabel
上设置不透明(false)
,然后在
JLabel
上设置不透明(true),您要闪烁其颜色。请注意,在执行
setOpaque(true)
之前,您可能希望等待下一次计时器迭代,因此如果您要连续多次闪烁相同的
JLabel
,则闪烁不会同时运行


使用
setOpaque()
的优点是,您可以将
MouseListener
设置为只需在按下时调用
setOpaque(true)
,在释放时调用
setOpaque(false)
,并检查是否单击了正确的
JLabel
,无需重复计算给定的
JLabel

使用哪种颜色,您不必使用
JButton
。您可以使用
JLabels
JPanels

okJButton = new JButton() {
@Override
public void paintComponent(Graphics g) {
    g.setColor(Color.decode("0X123456"));
    g.fillRect(0, 0, getSize().width, getSize().height);
}
};
okJButton.setForeground(Color.white);
okJButton.setBorder(new LineBorder(Color.white, 1));
在初始化过程中,您可以在每个鼠标上设置其颜色,并在每个鼠标上添加一个鼠标侦听器以检测单击

要刷新Simon模式,请创建一个每秒触发一次的
javax.swing.Timer
。(如果1秒看起来很长,您可能需要配置延迟。)为简单起见,计时器可以在所有
JLabel
上设置不透明(false),然后在
JLabel
上设置不透明(true),您要闪烁其颜色。请注意,在执行
setOpaque(true)
之前,您可能希望等待下一次计时器迭代,因此如果您要连续多次闪烁相同的
JLabel
,则闪烁不会同时运行


使用
setOpaque()
的优点是,您可以将
MouseListener
设置为只需在按下时调用
setOpaque(true)
,在释放时调用
setOpaque(false)
,并检查是否单击了正确的
JLabel
,无需重复计算给定的
JLabel

应使用哪种颜色,这是正确的方法,但您应该使用javax.swing.Timer而不是TimerTask,因为应在EDT上进行setOpaque调用。感谢您捕捉到这一点,Russ;我修复了它。这是正确的方法,但是您应该使用javax.swing.Timer而不是TimerTask,因为setOpaque调用应该在EDT上进行。谢谢您的关注,Russ;是的,
com.apple.laf.AquaButtonUI
是顽固的。有时我会使用
Icon
并设置Icon(this),使用
paintIcon()
而不是'paintComponent()。是的,
com.apple.laf.AquaButtonUI
是顽固的。有时我会实现
Icon
并执行
setIcon(this)
,使用
paintIcon()
而不是'paintComponent()。
paintComponent()
覆盖也适用于Windows 8(以获得另一个JButton背景色),而其他解决方案失败。
paintComponent()
覆盖也适用于Windows 8(以获得另一个JButton背景色),其他解决方案失败。
okJButton = new JButton() {
@Override
public void paintComponent(Graphics g) {
    g.setColor(Color.decode("0X123456"));
    g.fillRect(0, 0, getSize().width, getSize().height);
}
};
okJButton.setForeground(Color.white);
okJButton.setBorder(new LineBorder(Color.white, 1));