暂时改变JButton背景颜色?

时间:2010-03-17 18:35:36

标签: java swing jbutton

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

这是可能的,还是有更好的方法来用JButtons以外的东西做这个?我该如何实现呢?

另外,我正在运行Mac OS X,显然(根据我在论坛上阅读的一些内容)不喜欢JButtons背景改变(我认为这是因为系统的外观和感觉),我怎么能改变这样它可以在mac上运行吗?

提前感谢您的帮助:)

4 个答案:

答案 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。您可以使用JLabelsJPanels

在初始化期间,您可以在每个setBackground()上设置其颜色,并为每个颜色添加MouseListener以检测点击。

要闪烁Simon模式,请创建一个每秒触发一次的javax.swing.Timer。 (如果1秒钟似乎很长时间,您可能希望延迟可配置。)为简单起见,计时器setOpaque(false)上的JLabelssetOpaque(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));