Java 新线程未显示框架

Java 新线程未显示框架,java,multithreading,swing,concurrency,event-dispatch-thread,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(

我正在尝试建立网络连接,详细信息在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,一旦我完成了网络连接,这个等待消息就会正确显示

我错在哪里?这是一个摆动问题还是线程问题

您能帮我显示一条等待消息,直到后端活动完成吗?

actionPerformed下的代码在事件调度线程EDT下执行,而不是在注释中所说的主线程上执行

这意味着,只要连接发生了,EDT就会被阻塞,因此它不必有机会处理诸如显示JDialog之类的其他UI内容

另外,与问题无关,但请注意,您创建了一个从不显示的JFrame,它是JDialog的父级。

actionPerformed下的代码在事件调度线程EDT下执行,而不是在注释中所说的主线程上

这意味着,只要连接发生了,EDT就会被阻塞,因此它不必有机会处理诸如显示JDialog之类的其他UI内容


另外,与问题无关,但请注意,您创建的JFrame永远不会显示,它是JDialog的父线程。

您在这里混合了线程-所有与UI交互的操作,例如创建新帧,都必须在事件调度线程EDT或您所称的主线程上进行。后台任务应该在不同的线程上执行


基本上是向后的-您应该在新线程中执行后台工作,并在主线程中创建新框架,这与您现在的方式相反。

您在这里混合了线程-所有与UI交互的操作,例如创建新框架,都必须在事件调度线程EDT上发生,或者你所说的主线程。后台任务应该在不同的线程上执行


基本上是向后的-你应该在新线程中执行后台工作,并在主线程中创建新框架,这与你现在的方式相反。

有趣的是,你调用waitDialog.setSize 100,40;waitDialog.setBounds 500300,300,80;setBounds是同时调用setLocation和setSize的快捷方式;waitDialog.setBounds 500300,300,80;setBounds是一种同时调用setLocation和setSize的快捷方式。+1实际上,他把它全部颠倒了过来。等待对话框应该在actionPerformed中启动,而连接应该在新线程中完成。为了澄清这一切,通常称为主线程的是在JVM启动时调用mainString[]args方法的线程。它通常与EDT混合使用,因为许多用户在主线程中启动UI,而实际上应该使用SwingUtilities.invokeLater在EDT中执行此操作。@ajshort感谢您的详细解释。它部分解决了我的问题。我在新线程中做了背景工作,它也创建了网络连接。同时我将waitDialog.setVisible设置为true;在我的主线中。但是在设置了这个之后,我的主线程根本就没有恢复。waitDialog.setVisibletrue;中发生了什么;?它显示等待对话框。但在那之后一切都不起作用了。我添加了一个条件来检查我的背景工作是否完成。如果是这样,我试图隐藏Waitdialog。但是这个条件本身没有运行。waitDialog.setVisibletrue冻结主线程.Pl Help不应添加条件,而应将创建的线程的回调添加回主线程,以在工作完成时通知它。有一个SwingWorker类,它是专为您正试图做的事情而设计的。它将在后台运行任务,然后在完成时在EDT上调用done方法。有关非常好的概述,请参阅。@ajshort我完成了这个应用程序,并想创建一个jar。我引用了一些图像,比如Toolkit.getDefaultToolkit.getImagegetClass.getClassLoader.getResource/images/icon.gif;但是jar根本没有执行。我怎样才能把这些图像放进罐子里?+1事实上,他把它们都倒过来了。等待对话框应该在actionPerformed中启动,而连接应该在新线程中完成。为了澄清这一切,通常称为主线程的是在JVM启动时调用mainString[]args方法的线程。它通常与EDT混合使用,因为许多用户在主线程中启动UI,而实际上应该使用SwingUtilities.invokeLater在EDT中执行此操作。@ajshort感谢您的详细介绍
错误的解释。它部分解决了我的问题。我在新线程中做了背景工作,它也创建了网络连接。同时我将waitDialog.setVisible设置为true;在我的主线中。但是在设置了这个之后,我的主线程根本就没有恢复。waitDialog.setVisibletrue;中发生了什么;?它显示等待对话框。但在那之后一切都不起作用了。我添加了一个条件来检查我的背景工作是否完成。如果是这样,我试图隐藏Waitdialog。但是这个条件本身没有运行。waitDialog.setVisibletrue冻结主线程.Pl Help不应添加条件,而应将创建的线程的回调添加回主线程,以在工作完成时通知它。有一个SwingWorker类,它是专为您正试图做的事情而设计的。它将在后台运行任务,然后在完成时在EDT上调用done方法。有关非常好的概述,请参阅。@ajshort我完成了这个应用程序,并想创建一个jar。我引用了一些图像,比如Toolkit.getDefaultToolkit.getImagegetClass.getClassLoader.getResource/images/icon.gif;但是jar根本没有执行。如何将图像包含到jar中?