Java 如何在不冻结线程的情况下延迟回答?

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.

简单的问题。 sleepx冻结了整个代码,所以即使是按钮也会保持按下时未按下的状态

我想基本上点击一个按钮,等待计算机做它的事情x的时间量,然后输出一些东西

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.在回答有关摆动计时器的问题之前,请先了解如何使用摆动计时器