我想禁用
JButton
大约 10 秒。有办法吗?
谢谢
首先阅读
@MadProgrammer
的答案,然后浏览那里提供的链接。如果您仍然需要基于这些建议的工作示例,请参考以下示例。
为什么这个解决方案比提供的几个解决方案更好
这是因为它使用了一个
javax.swing.Timer
来启用使GUI 相关任务能够在事件派发线程(EDT)上自动执行的按钮。这避免了 swing 应用程序与非 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);
}
});
}
}
您可以使用
Thread
、Task
或更简单的 Timer
类。
你可以使用 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 秒。
您可以发布有关代码的更多详细信息,我可以提供帮助