我有一个保存按钮JFrame
;单击保存时,将“保存”文本设置为“保存....”;我需要在延迟 10 秒后将该文本设置为“已保存”。在 java 中怎么可能?请帮忙...
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
这就是我所做的……但这在延迟时间内不会显示为“保存”。
我有一个保存按钮JFrame
;单击保存时,将“保存”文本设置为“保存....”;我需要在延迟 10 秒后将该文本设置为“已保存”。在 java 中怎么可能?请帮忙...
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
这就是我所做的……但这在延迟时间内不会显示为“保存”。
如果您想向用户提供正在发生的事情的视觉反馈(并且可能给出有关进度的一些提示),那么请选择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();
}
});
这个问题和前 3 个答案走错了路。
JProgressBar
表示正在发生的事情。如果不知道任务的长度,将其设置为不确定,但想必您知道需要保存多少以及当前保存多少。SwingWorker
长时间运行的任务。有关更多详细信息,请参阅Swing 中的并发。最好的办法是使用计时器,它的方法延迟执行:http: //developer.apple.com/library/mac/documentation/java/reference/javase6_api/api/java/util/Timer.html#schedule (java .util.TimerTask,长)。使用 timertask 来包装你的 runnable,就是这样。