我是Java的新手,需要一些帮助。 我正在制作一个小的桌面应用程序,我基本上有一个4个JButtons(2 x 2网格)的网格,我需要更改单个JButton的背景颜色,并在一秒后,更改回原始颜色(我试图制作的游戏就像西蒙一样,你必须遵循点亮的按钮模式)。 我有一个包含随机生成的数字的向量,范围为1到4,我希望能够从向量中获取每个元素,并获得相应的按钮,以便在一秒钟内更改为不同的颜色(例如,如果vector包含2 4 1,我希望按钮2改变,然后按钮4改变,然后按钮1改变)。
这是可能的,还是有更好的方法来用JButtons以外的东西做这个?我该如何实现呢?
另外,我正在运行Mac OS X,显然(根据我在论坛上阅读的一些内容)不喜欢JButtons背景改变(我认为这是因为系统的外观和感觉),我怎么能改变这样它可以在mac上运行吗?
提前感谢您的帮助:)
答案 0 :(得分:3)
一种方法是扩展JToggleButton
并覆盖paintComponent()
以显示颜色。 javax.swing.Timer
可以控制时间。这是一个更精细的example。
private static class SimonButton extends JToggleButton {
private final Color color;
Dimension size = new Dimension(100, 100);
public SimonButton(Color color) {
this.color = color;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (this.isSelected()) {
g.setColor(color);
} else {
g.setColor(Color.lightGray);
}
g.fillRect(0, 0, this.getWidth(), this.getHeight());
}
@Override
public Dimension getPreferredSize() {
return size;
}
}
答案 1 :(得分:3)
您可以使用setBackground(...)方法设置Color,然后使用Swing Timer在触发时重置背景。
编辑:
如果你的问题是setBackground()方法对某些LAF不起作用,那么你可以在按钮上添加一个纯颜色的Icon。然后要更改背景颜色,只需更改图标。
答案 2 :(得分:2)
出于您的目的,您不一定要使用JButton
。您可以使用JLabels
或JPanels
。
在初始化期间,您可以在每个setBackground()
上设置其颜色,并为每个颜色添加MouseListener
以检测点击。
要闪烁Simon模式,请创建一个每秒触发一次的javax.swing.Timer
。 (如果1秒钟似乎很长时间,您可能希望延迟可配置。)为简单起见,计时器setOpaque(false)
上的JLabels
,setOpaque(true)
上的JLabel
你想要闪现的颜色。请注意,在执行setOpaque(true)
之前,您可能希望等到下一次计时器迭代,因此如果要连续多次闪烁相同的JLabel
,闪烁不会一起运行。
使用setOpaque()
的好处是,您可以将MouseListener
设置为仅在发布时调用setOpaque(true)
并在发布时调用setOpaque(false)
,并检查是否正确{{1}点击后,无需反复重新计算应该为给定JLabel
使用哪种颜色。
答案 3 :(得分:0)
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));