我有一个要在主框架运行时显示的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 []值的方法,在此方法的某个点上,我有以下代码调用新线程以获取返回原始主方法所需的值: / p>
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()};
没有列出第二帧的全部代码,当用户按下按钮时,在与按钮绑定的侦听器的末尾,按下i,我想关闭帧并返回从列表中选择的字符串:
jf.dispose();
myt.setResult(AdminSelection);
在框架类中,我声明了以下实例变量:
String AdminSelection = null;
myThread myt;
我希望这对某人有足够的信息,可以帮助我并了解这里出了什么问题。
答案 0 :(得分:0)
join()函数要等到run()方法的结尾,当您执行t.join()时,您的线程已经或即将结束。这是因为在用户单击确认按钮之前,在run()方法中没有阻塞线程的内容。而且最好是这样!
在这里创建线程是没有意义的,您应该使用回调,或更普遍地在Java中使用侦听器。您可以查看以下链接:https://guides.codepath.com/android/Creating-Custom-Listeners
但是,特别是如果您想暂停主代码,则应该使用为此而设计的JDialog!不要试图自己阻止UI,您可能会错误地阻止UI线程(由Swing / AWT处理)。创建JDialog更好,因为在UI线程上已经为此使用做好了一切。
此外,您必须知道创建线程的时间很长,请在需要时使用线程。