1

我是 Java 的超级新手,需要一些帮助。我正在制作一个小型 Java 桌面应用程序,其中基本上有 4 个 JButton 网格(2 x 2 网格),我需要更改各个 JButton 的背景颜色,一秒钟后,改回原始颜色(我正在尝试制作的游戏就像西蒙一样,您必须遵循点亮按钮的模式)。我有一个包含 1 到 4 范围内随机生成的数字的向量,我希望能够从向量中获取每个元素并获取相应的按钮以在一秒钟内更改为不同的颜色(例如,如果矢量包含 2 4 1,我希望按钮 2 更改,然后按钮 4 更改,然后按钮 1 更改)。

这是可能的,还是有更好的方法来使用 JButtons 以外的东西来做到这一点?我该如何实施?

另外,我正在运行 Mac OS X,显然(基于我在论坛上阅读的一些内容)不喜欢 JButtons 背景更改(我认为这是因为系统外观和感觉),我该如何更改它呢在mac上工作?

预先感谢您的任何帮助 :)

4

4 回答 4

3

您可以使用 setBackground(...) 方法设置颜色,然后使用 Swing Timer 在触发时重置背景。

编辑:

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

于 2010-03-17T20:49:28.433 回答
3

一种方法是扩展JToggleButton和覆盖paintComponent()以显示颜色。Ajavax.swing.Timer可以控制时间。这是一个更详细的例子

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;
    }
}
于 2010-03-17T20:27:24.470 回答
2

出于您的目的,您不一定必须使用JButton. 您可以使用JLabelsJPanels

在初始化过程中,您可以setBackground()对每一个设置颜色,并MouseListener为每一个添加一个以检测点击。

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

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

于 2010-03-17T21:23:44.410 回答
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));
于 2014-02-12T20:54:26.000 回答