Java 如何在不冻结线程的情况下延迟回答?
简单的问题。 sleepx冻结了整个代码,所以即使是按钮也会保持按下时未按下的状态 我想基本上点击一个按钮,等待计算机做它的事情x的时间量,然后输出一些东西Java 如何在不冻结线程的情况下延迟回答?,java,swing,sleep,Java,Swing,Sleep,简单的问题。 sleepx冻结了整个代码,所以即使是按钮也会保持按下时未按下的状态 我想基本上点击一个按钮,等待计算机做它的事情x的时间量,然后输出一些东西 public class bsp extends JFrame { DrawPanel drawPanel = new DrawPanel(); public bsp() { setSize(600,600); JButton Hit = new JButton("Hit him"); Hit.
public class bsp extends JFrame {
DrawPanel drawPanel = new DrawPanel();
public bsp() {
setSize(600,600);
JButton Hit = new JButton("Hit him");
Hit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
Thread.sleep(1500);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("I hit you back!");
}
});
Hit.setSize(80, 30);
Hit.setLocation(200, 400);
add(Hit);
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(drawPanel);
setVisible(true);
}
private static class DrawPanel extends JPanel {
protected void paintComponent(Graphics g) {
}
}
public static void main(String[] args) {
new bsp();
}
}
如您所见,按钮保持按下状态,整个程序被冻结。
但我基本上想在回答之前模拟人工智能思维,而不是冻结所有内容。考虑使用计时器防止主线程冻结:
import javax.swing.*;
import java.awt.event.*;
ActionListener task = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
}
};
Timer countdown = new Timer(1000 ,task);
countdown.setRepeats(false);
countdown.start();
其中1000是以毫秒为单位的延迟时间,actionPerformed函数中是代码在设置延迟时间后执行的位置。设置a而不是休眠线程。另一个选项是查看ScheduledExecutorService。因此,如果我使用延迟。。。我将在哪里实现其他计算?比如说我想添加一个简单的想法。。。当这个延迟还在发生的时候?@Razak:这个答案是不正确的,因为暗月亮推荐了错误的计时器。您不应该使用java.util.Timer,因为这会违反Swing线程规则,但对于Swing程序,始终使用javax.Swing.Timer,也称为Swing计时器。前者会导致您的程序意外地、间歇性地失败,并出现线程错误,这可能很难调试,而后者将正常工作。不知道太多确实非常正确您还没有修复您的答案-1.在回答有关摆动计时器的问题之前,请先了解如何使用摆动计时器