【问题标题】:How to use a thread to run another JFrame while the main is still running如何在 main 仍在运行时使用线程运行另一个 JFrame
【发布时间】:2019-05-10 18:06:06
【问题描述】:

我有一个 jframe,我想在我的主框架运行时显示。我想暂停我的主要代码,直到用户在另一帧上执行必要的操作。我已经阅读了很多解决方案,但我需要看到它完成了我的代码才能完全理解和掌握它。我不想像以前看到的那样使用 jdialog 作为答案。我的主要目标是更好地理解线程,以便我可以在不同情况下使用我学到的东西。

使用我创建的代码,在运行线程时,只加载框架,框架上没有其他功能。 (框架很简单,它有一个标签,一个用户从中选择的列表,以及一个基本上返回所选列表值的按钮。)它就像线程被切断完成或其他东西。

这是我的班级调用屏幕:

public class myThread implements Runnable {

    String result = null;

    public void run() {
        MessageScreen ms = new MessageScreen();
        ms.setVisible(true);
    }

    public String getResult() {
        return result;
    }

    public void setResult(String AS) {
        result = AS;
    }

}

在我的主代码中,调用了一个返回 String[] 值的方法,使用此方法时,我有以下代码调用新线程以获取在原始主方法中返回所需的值:

    myThread mt = new myThread();
    Thread t = new Thread(mt);
    t.start();
    try {
        t.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    myreturn = new String[] {"true", mt.getResult()}; 

没有列出第二帧的整个代码,当用户按下按钮时,在绑定到按钮的侦听器的末尾按下我想关闭框架并返回从列表中选择的字符串:

jf.dispose();
myt.setResult(AdminSelection);

在框架类中,我声明了以下实例变量:

String AdminSelection = null;
myThread myt; 

我希望这些信息足以帮助我了解这里出了什么问题。

【问题讨论】:

  • 你应该把框架“跑”的想法抛在脑后。框架响应事件。通常,当您看到帧中发生的事情时,如果它不是由用户输入驱动(例如,通过鼠标点击或键盘按下),那么它可能是由 timer events 驱动的。
  • 在 Swing 框架中,事件由框架的事件调度线程(也称为 EDT)调用您注册的处理程序方法来传递。 Swing 的大多数方法不是线程安全的,它们不应该被任何其他线程调用。

标签: java multithreading jframe


【解决方案1】:

函数 join() 等到 run() 方法结束,当你执行 t.join() 时,你的线程已经或即将结束。这是因为在您的 run() 方法中,在用户单击确认按钮之前,没有任何东西会阻塞线程。最好这样!

在这里创建线程是没有意义的,你应该使用回调,或者在Java中更一般地,一个监听器。你可以看看这个链接:https://guides.codepath.com/android/Creating-Custom-Listeners

但是,特别是如果你想暂停你的主代码,你应该使用为此而设计的 JDialog!不要试图自己阻塞 UI,你可能会错误地阻塞 UI 线程(由 Swing/AWT 处理)。创建一个 JDialog 会更好,因为在 UI 线程上已经为这种用法做好了一切。

另外,你要知道创建一个线程真的很长,真正需要的时候使用线程。

【讨论】:

  • 能否再详细解释一下run方法末尾的join?我尝试使用线程的原因是因为我有一个带有按钮的 jframe,并且在某些情况下,绑定到按钮的侦听器将调用这个新的 messagescreen 以将值返回给侦听器。我的问题是侦听器代码没有暂停消息屏幕以返回用户选择的值。我想看看我如何用我的代码做一个线程来暂停监听器并等到另一个屏幕完成,但我想我只会使用一个 jdialog
  • 是的,在您的情况下,JDialog 是完美的。关于join方法,这个方法一直等到线程结束。线程的结束基本上是run方法结束的时候。因此,如果在您的 run 方法中没有时间昂贵的代码(大工作、睡眠......),那么线程很快就会结束。这是你的情况,创建一个窗口并显示它不是阻塞操作(这就是线程完全没用的原因)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 2018-04-17
  • 1970-01-01
相关资源
最近更新 更多