Java 临时更改JButton背景色?
我对Java非常陌生,需要一些帮助。 我正在制作一个小型java桌面应用程序,其中我基本上有一个由4个按钮组成的网格(2 x 2网格),我需要更改各个按钮的背景颜色,一秒钟后,更改回原始颜色(我尝试制作的游戏类似于Simon,你必须按照点亮的按钮模式进行操作)。 我有一个向量,包含随机生成的数字,范围在1到4之间,我希望能够从向量中获取每个元素,并获得相应的按钮,以在一秒钟内更改为不同的颜色(例如,如果向量包含2 4 1,我希望按钮2更改,然后按钮4更改,然后按钮1更改) 这是可能的,还是有更好的方法来实现这一点,而不是使用jbutton?我如何实现这一点 另外,我正在运行MacOSX,这显然(基于我在论坛上读到的一些东西)不喜欢JButtons背景的改变(我认为这是因为系统的外观和感觉),我如何改变它使其在Mac上工作 提前感谢您的帮助:)一种方法是扩展并覆盖Java 临时更改JButton背景色?,java,swing,jbutton,Java,Swing,Jbutton,我对Java非常陌生,需要一些帮助。 我正在制作一个小型java桌面应用程序,其中我基本上有一个由4个按钮组成的网格(2 x 2网格),我需要更改各个按钮的背景颜色,一秒钟后,更改回原始颜色(我尝试制作的游戏类似于Simon,你必须按照点亮的按钮模式进行操作)。 我有一个向量,包含随机生成的数字,范围在1到4之间,我希望能够从向量中获取每个元素,并获得相应的按钮,以在一秒钟内更改为不同的颜色(例如,如果向量包含2 4 1,我希望按钮2更改,然后按钮4更改,然后按钮1更改) 这是可能的,还是有更好
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));