我正在尝试建立网络连接,详细信息在JFrame中。当用户单击一个按钮时,它应该启动新线程,并且应该向用户显示等待消息,直到主线程建立网络连接。我写了这段代码
public void actionPerformed(ActionEvent arg0) {
Thread ref = new Thread(new Test());//Create a new thread
ref.start();
new AIDRTConnManager().createConnection(ipAddress, portAddress);//main thread
}
//This is my Thread Class
public class Test implements Runnable{
JDialog waitDialog;
JPanel panel1 = new JPanel();
JLabel waitLabel;
JFrame frame;
public void run(){
frame = new JFrame();
waitDialog = new JDialog( frame,AIRDT.toolName, true );
waitDialog.setDefaultCloseOperation( JDialog.DO_NOTHING_ON_CLOSE );
JLabel waitLabel = new JLabel( "Trying to Connect to PleaseWait...",ErrorDialog.icon,SwingConstants.CENTER );
panel1.add( waitLabel );
waitDialog.add( panel1 );
waitDialog.setSize( 100, 40 );
waitDialog.setBounds( 500,300, 300, 80 );
waitDialog.setVisible( true );
}
}
但是当我点击按钮时,Jdialog显示空框架,没有等待消息(JLable),一旦我完成了网络连接,这条等待消息显示正确。
我哪里错了?这是一个Swing问题(或)线程问题吗?
在完成后端活动之前,您能否帮我看一下等待消息?
答案 0 :(得分:3)
actionPerformed
下的代码在Event Dispatch Thread(EDT)下执行,而不是在评论中说的主线程上执行。
这意味着只要连接事件发生,EDT就会被阻止,因此它不必处理其他UI内容,例如显示JDialog
。
此外,与此问题无关,但请注意,您创建的JFrame
永远不会显示,而且是您JDialog
的父级。
答案 1 :(得分:3)
你在这里混淆了你的线程 - 所有与UI交互的操作,比如创建一个新的框架,必须在你调用它时发生在事件调度线程(EDT)或“主”线程上。后台任务应该在不同的线程上执行。
基本上你有它倒退 - 你应该在新线程中执行后台工作,并在主线程中创建新帧,这与你现在的方式相反。