如何使JButton在一段时间内更改颜色,然后再恢复到原始颜色?

3

我想创建一个计算器,当按下按键时,按键的颜色会改变,并在3000毫秒后返回其初始颜色(白色)。为此,我实现了JButton.setBackground()方法,并编写了代码使按键在3000毫秒后恢复到原始颜色。 但是,每次我点击计算器按键时,它都会等待3000毫秒才将JButton值返回给我,它会改变颜色,但不会恢复到其原始颜色。我尝试了几个操作,但没有成功。 这是我用于使JButton在给定时间内更改颜色并在返回其初始颜色之前等待的代码:

try {
    buttonOne.setBackground(Color.RED) ;
    Thread.sleep(millis:3000) ;
    buttonOne.setBackground(Color.WHITE);
} catch (InterruptedException interruptedException ) {
    InterruptedException.printStackTrace();
}

1
@justsomeone:不,請刪除您的非線程安全建議。原帖作者,解決方案不是使用Java的util.Timer,而是使用Swing Timer。這允許進行Swing線程安全延遲。java.util.Timer(就像上面某人推薦的)會在Swing事件線程之外對Swing組件狀態進行更改,這可能會導致間歇性和不可預測的線程異常。 - Hovercraft Full Of Eels
@HovercraftFullOfEels 好的,谢谢你的建议。 - user16669986
1
@HovercraftFullOfEels 这个问题最初被关闭为重复的:https://stackoverflow.com/questions/2464901/changing-jbutton-background-colour-temporarily。我不知道为什么会选择这个作为重复的问题。是的,答案提到了一个计时器,但它没有提供如何使用计时器的代码或者使用计时器的Swing教程链接。这个答案也提到了一个计时器并提供了一些基本的代码。所以这是更好的答案。这个网站的目的不是关闭每一个问题,而是提供有用的答案。 - camickr
@camickr:我猜那个问题的答案,包括这个并没有什么帮助。真遗憾。 - Hovercraft Full Of Eels
@HovercraftFullOfEels 我已经说过那不是一个好的答案。在过去的11年中,我学会了如何提供更好的答案并尝试这样做。 - camickr
1个回答

4

您不希望在UI中使用Thread.sleep(),因为您希望UI保持响应。

可以尝试像这样处理:

import javax.swing.Timer;

JButton buttonOne = new JButton("Click me");
Timer timer = new Timer(3000 ,afterButtonClicked);
timer.setRepeats(false);

ActionListener afterButtonClicked = new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        buttonOne.setBackground(Color.WHITE);
    }
};

在您的按钮上的操作侦听器中:
buttonOne.setBackground(Color.RED);
timer.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接