我想禁用JButton
约10秒钟。有没有办法做到这一点?
谢谢
答案 0 :(得分:3)
使用Swing Timer
,在触发时,它会在事件调度线程的上下文中通知已注册的侦听器,从而可以安全地更新UI。
有关详细信息,请参阅How to use Swing Timers和Concurrency in Swing
答案 1 :(得分:1)
首先阅读@MadProgrammer
的答案并浏览其中提供的链接。如果您仍需要基于这些建议的工作示例,则以下是一个。
为什么解决方案优于提供的解决方案
因为它使用javax.swing.Timer
来启用按钮,该按钮可以在事件派发线程(EDT)上自动执行GUI相关任务。这样可以避免摆动应用与非EDT操作混合。
请尝试以下示例:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class SwingDemo extends JPanel {
private final JButton button;
private final Timer stopwatch;
private final int SEC = 10;
public SwingDemo() {
button = new JButton("Click me to disable for " + SEC + " secs");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JButton toDisable = (JButton) e.getSource();
toDisable.setEnabled(false);
stopwatch.start();
}
});
add(button);
stopwatch = new Timer(SEC * 1000, new MyTimerListener(button));
stopwatch.setRepeats(false);
}
static class MyTimerListener implements ActionListener {
JComponent target;
public MyTimerListener(JComponent target) {
this.target = target;
}
@Override
public void actionPerformed(ActionEvent e) {
target.setEnabled(true);
}
}
public static void main(String[] args) {
final JFrame myApp = new JFrame();
myApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myApp.setContentPane(new SwingDemo());
myApp.pack();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
myApp.setVisible(true);
}
});
}
}
答案 2 :(得分:0)
您可以使用Thread
,Task
或更简单的Timer
类。
答案 3 :(得分:-1)
你可以使用Thread.sleep(以毫秒为单位的时间)
例如: 了Thread.sleep(10000); //睡10秒
JButton button = new JButton("Test");
try {
button.setEnabled(false);
Thread.sleep(10000);
button.setEnabled(true);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
但它必须在一个单独的线程中,否则会使所有GUI挂起10秒钟。
您可以发布有关代码的更多详细信息,我可以提供帮助