Java 在单击时禁用JButton,并在1秒后重新启用它?

Java 在单击时禁用JButton,并在1秒后重新启用它?,java,swing,Java,Swing,我需要在单击时禁用JButton,并在2秒钟后再次启用它,因此我尝试从事件处理程序休眠ui线程,但这会使按钮处于选中状态,您无法读取禁用按钮的文本 代码如下所示: JButton button = new JButton("Press me"); button.addActionListener(new ActionListener{ public void actionPerformed(ActionEvent ae) { JButton button = ((JBut

我需要在单击时禁用JButton,并在2秒钟后再次启用它,因此我尝试从事件处理程序休眠ui线程,但这会使按钮处于选中状态,您无法读取禁用按钮的文本

代码如下所示:

JButton button = new JButton("Press me");
button.addActionListener(new ActionListener{
    public void actionPerformed(ActionEvent ae) {
        JButton button = ((JButton)e.getSource());
        button.setEnabled(false);
        button.setText("Wait a second")
        button.repaint();
        try {
           Thread.sleep(2000);
        } catch (InterruptedException ie) {
        }
        button.setEnabled(true);
        button.setText("");
    }
发生的情况是,按钮在2秒钟内保持“正在选择”状态,没有文本,并在最后立即禁用和重新启用按钮,这不是我想要的,我的目标是按钮在禁用状态下保持两秒钟,上面有文本,然后重新启用


我该怎么办?

如图所示-“不要使用线程。在UI线程上睡眠(UI“冻结”并且没有机会重新绘制)。使用计时器类。”

这是一个他所指的例子。应该接近您想要做的事情:

JButton button = new JButton("Press me");
int delay = 2000; //milliseconds
Timer timer = new Timer(delay, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        button.setEnabled(true);
        button.setText("");
    }
});
timer.setRepeats(false);
button.addActionListener(new ActionListener {
    public void actionPerformed(ActionEvent ae) {
        JButton button = ((JButton)e.getSource());
        button.setEnabled(false);
        button.setText("Wait a second")
        timer.start();
    }
}

不要在UI线程上使用Thread.sleep(UI“冻结”并且没有机会重新绘制)。使用计时器。有许多重复项。您是否尝试过禁用任何事件或计时器代码之外包含文本的按钮,以确认它在任何情况下都能产生您想要的效果@读取javax.swing.Timer的javadoc。在actionPerformed方法中,取消按钮,并启动计时器,该计时器将在1秒后重新启动。在stack exchange meta上进行了讨论,一致同意剽窃评论并将其放入答案中。我不是开玩笑。当然,我会拼凑一个例子。@user2864740谢谢你的输入。我做了一些腿部工作,使答案更完整。@1谢谢,这样更好。我真的很高兴我的评论一开始就被使用了(不需要链接我!),但我不喜欢太简短的回答!一个或两个参考-JB Nizet有一个很好的建议-将有助于完善细节。@user2864740我不完全确定他的意思,但如果有人编辑它,我将接受更改。