新线程没有显示框架

时间:2013-02-20 08:27:04

标签: java multithreading swing concurrency event-dispatch-thread

我正在尝试建立网络连接,详细信息在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问题(或)线程问题吗?

在完成后端活动之前,您能否帮我看一下等待消息?

2 个答案:

答案 0 :(得分:3)

actionPerformed下的代码在Event Dispatch Thread(EDT)下执行,而不是在评论中说的主线程上执行。

这意味着只要连接事件发生,EDT就会被阻止,因此它不必处理其他UI内容,例如显示JDialog

此外,与此问题无关,但请注意,您创建的JFrame永远不会显示,而且是您JDialog的父级。

答案 1 :(得分:3)

你在这里混淆了你的线程 - 所有与UI交互的操作,比如创建一个新的框架,必须在你调用它时发生在事件调度线程(EDT)或“主”线程上。后台任务应该在不同的线程上执行。

基本上你有它倒退 - 你应该在新线程中执行后台工作,并在主线程中创建新帧,这与你现在的方式相反。