在java中设置按钮单击的延迟?

问题描述 投票:0回答:4

我在

JFrame
中有一个保存按钮;单击保存时,“保存”文本设置为“保存...”;我需要在延迟 10 秒后将该文本设置为“已保存”。在 java 中这怎么可能? 请帮忙...

try {
    Thread.sleep(4000);
} catch (InterruptedException e) {

    e.printStackTrace();
}

这就是我所做的......但这不会在延迟的时间内显示为“保存”。

java swing concurrency timer
4个回答
7
投票

如果您想向用户提供正在发生的事情的视觉反馈(并且可能给出一些有关进度的提示),那么请使用

JProgressBar
SwingWorker
更多详细信息)。

另一方面,如果您想要出现一种情况,当用户单击按钮并且任务应该在后台运行(当用户执行其他操作时),那么我会使用以下方法:

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {                                          
        button.setEnabled(false); // change text if you want
        new SwingWorker<Void, Void>() {
            @Override
            protected Void doInBackground() throws Exception {
                // Do the calculations
                // Wait if you want
                Thread.sleep(1000);
                // Dont touch the UI
                return null;
            }
            @Override
            protected void done() {
                try {
                    get();
                } catch (Exception ignore) {
                } finally {
                    button.setEnabled(true); // restore the text if needed
                }
            }                    
        }.execute();
    }
});

最后,使用

Swing
特定计时器的初始解决方案

final JButton button = new JButton("Save");
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {                                          
        // Take somehow care of multiple clicks
        button.setText("Saving...");
        final Timer t = new Timer(10000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                button.setText("Saved");
            }
        });
        t.setRepeats(false);
        t.start();
    }
});

7
投票

这个问题和前 3 个答案走错了路。

  • 使用
    JProgressBar
    表示正在发生某事。 如果任务的长度未知,但想必您知道需要节省多少以及当前节省了多少,请将其设置为不确定。
  • 不要阻塞 EDT(事件调度线程)——发生这种情况时 GUI 将“冻结”。使用
    SwingWorker
    来执行长时间运行的任务。有关更多详细信息,请参阅 Swing 中的并发

2
投票

最好是使用计时器及其方法延迟执行:http://developer.apple.com/library/mac/documentation/java/reference/javase6_api/api/java/util/Timer.html#schedule (java.util.TimerTask,长)。使用计时器任务来包装您的可运行程序,就是这样。


0
投票

这是我发现的关于 Java Swing 计时器的很棒的教程:https://www.youtube.com/watch?v=XHd2s9hV8Tc

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.