如何使线程不冻结整个JFrame。JAVA

如何使线程不冻结整个JFrame。JAVA,java,swing,jframe,freeze,Java,Swing,Jframe,Freeze,嘿,我只需要回答一个问题。。。 如何使下面的代码不冻结我的整个JFrame try { Thread.sleep(Integer.parseInt(delayField.getText()) * 1000); System.out.println("Hello!"); } catch(InterruptedException ex) { Thre

嘿,我只需要回答一个问题。。。 如何使下面的代码不冻结我的整个JFrame

                try {
                Thread.sleep(Integer.parseInt(delayField.getText()) * 1000);
                System.out.println("Hello!");
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }

您不希望在UI(或事件调度线程)线程上执行此操作。而是在一个单独的线程中。否则(如您所见),您将阻塞UI


在一个单独的线程上执行耗时的操作是一种很好的做法,如果这些线程需要执行一些后续的UI操作(例如,在上面的UI中显示“Hello”)

这不是在java中使用线程的正确方法。您应该使用swingutilities.invokelater


使用不同的线程执行此任务。如果在主UI线程中执行此操作,则它将冻结。。例如,您可以执行以下操作

  new Thread() {

        @Override
        public void run() {
            try {
                Thread.sleep(Integer.parseInt(delayField.getText()) * 1000);
                System.out.println("Hello!");
            } catch (InterruptedException ex) {
                Thread.currentThread().interrupt();
            }

        }
    }.start();
更新

在Robin和Marko的明智建议之后,我正在用更好的解决方案更新答案

    ActionListener taskPerformer = new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
                System.out.println("Hello!");

        }
    };
    javax.swing.Timer t = new javax.swing.Timer(Integer.parseInt(delayField.getText()) * 1000, taskPerformer);
    t.setRepeats(false);
    t.start();

每当您要在GUI代码中使用
Thread.sleep
时,请停下来想想Swing Timer,它是执行此任务的合适工具。计划需要延迟执行的任务


为此使用另一个线程并不是最好的建议:除了等待之外什么也不做会浪费大量的系统资源(一个线程)。

由于
JTextField#getText
不是线程安全的,因此您不应该从另一个线程调用该方法,而不是从另一个线程调用该方法EDT@Robin,是的,在发帖时没有想到这一点:(…可以使用同步方法获取文本..这会有任何副作用吗?我会在线程外检索文本,然后简单地将其传递到那里。为了延迟,我会完全丢弃线程并使用Marko Topolnik建议的计时器感谢@Robin对我的启发..我正在根据你的建议