我在JFrame
中有一个保存按钮;点击保存'保存'文本设置为'保存....';我需要在延迟10秒后将该文本设置为“已保存”。如何在Java中实现?
请帮忙......
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
这就是我所做的......但是在这段延迟的时间里,这不会显示为“拯救”。
答案 0 :(得分:7)
这个问题&前3个答案正在走错轨道。
JProgressBar
显示正在发生的事情。如果任务的长度未知,则将其设置为不确定,但可能您知道需要保存多少以及当前保存了多少。SwingWorker
进行长时间运行的任务。有关详细信息,请参阅Concurrency in Swing。答案 1 :(得分:6)
如果您想向用户提供正在进行某些操作的视觉反馈(并且可能会对进度提供一些提示),请转到JProgressBar
和SwingWorker
(more 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就是这样。