1

嘿,我只需要回答一个问题......我怎样才能让下面的代码不冻结我的整个 JFrame?

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

4 回答 4

8

使用不同的线程来执行此任务。如果您在主 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();
于 2013-05-28T09:35:18.353 回答
3

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

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

于 2013-05-28T09:54:33.470 回答
2

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

swing utils 稍后调用

于 2013-05-28T09:26:39.197 回答
1

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

在单独的线程上执行耗时的操作是一个好习惯,如果这些线程需要执行一些后续的 UI 操作(例如,在上面的 UI 中显示“Hello” ),则使用SwingUtilities.invokeLater( )

于 2013-05-28T09:25:16.447 回答