要在按钮上设置延迟,请单击java?

时间:2012-04-10 07:35:34

标签: java swing concurrency timer

我在JFrame中有一个保存按钮;点击保存'保存'文本设置为'保存....';我需要在延迟10秒后将该文本设置为“已保存”。如何在Java中实现? 请帮忙......

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

    e.printStackTrace();
}

这就是我所做的......但是在这段延迟的时间里,这不会显示为“拯救”。

3 个答案:

答案 0 :(得分:7)

这个问题&前3个答案正在走错轨道。

  • 使用JProgressBar显示正在发生的事情。如果任务的长度未知,则将其设置为不确定,但可能您知道需要保存多少以及当前保存了多少。
  • 不要阻止EDT(事件调度线程) - 当发生这种情况时,GUI将“冻结”。使用SwingWorker进行长时间运行的任务。有关详细信息,请参阅Concurrency in Swing

答案 1 :(得分:6)

如果您想向用户提供正在进行某些操作的视觉反馈(并且可能会对进度提供一些提示),请转到JProgressBarSwingWorkermore details)。

如果另一方面你想要有一个情况,当用户点击按钮并且任务应该在后台运行时(当用户做其他事情时),那么我会使用以下方法:

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 specific timer的初始解决方案:

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();
    }
});

答案 2 :(得分:2)

最好是使用计时器,其方法执行延迟:http://developer.apple.com/library/mac/documentation/java/reference/javase6_api/api/java/util/Timer.html#schedule(java.util.TimerTask,long)。使用timertask来包装你的runnable就是这样。