SwingWorker调用JFrame类..窗口显示没有

时间:2015-06-11 11:20:01

标签: java swing jframe swingworker event-dispatch-thread

class class1{
    public class1(){//here is my GUI commants}

@Override  
     public void actionPerformed(ActionEvent evt)   //this is my action performed from a jframe window      
 {  

    worker = new SwingWorker<Void, Void>(){//ia m creating a worker
    protected  WaitWindow waitWindow;
    @Override
    protected Void doInBackground() throws Exception {
         waitWindow= new  WaitWindow();//i call waitWindow class to pop up my new window with the progressBar
         return null;
    }
    @Override
    protected void done(){
        waitWindow.CloseWaitWindow();
    }
};
try{  
    String option = (String)serversList.getSelectedItem();

      if (evt.getSource().equals(Button1))//when client presses button1
       {                                                      
         if(option.equals("icsd Server"))
           {//here is my connection
            Registry registry = LocateRegistry.getRegistry("localhost",1080);
            icsdserver = (ICSDinterface)registry.lookup("RmiCheckICSD");
            worker.execute(); //i am calling execute until the server return 0 this might take a long time 
            if (icsdserver.RequestForEntry("icsd",0)==0)
                {
                 worker.cancel(true); //when server tell its all ok (with 0) i call cancel(true)
                 AddGrade d = new AddGrade(icsdserver,"icsd");
                }
            }
       }
    }
catch (RemoteException ex) {System.out.println(ex);}
catch (NotBoundException ex) {System.out.println(ex);}
}}

Wait Window类遵循

class  WaitWindow extends JFrame //my WaitWindow Class
{

   private JProgressBar bar ;

   public WaitWindow(){

   super("Wait Until Connection Is ready");
   setSize(100,200);
   bar = new JProgressBar();
   bar.setIndeterminate(true);
   bar.setPreferredSize(new Dimension(300,330));
   add(bar);
   getContentPane();
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   setVisible(true);
}


public void CloseWaitWindow()
            {
            removeNotify();
             }


        }

我在这里做错了什么?我希望等待窗口显示,直到服务器的RequestForEntry方法返回0,这可能需要一些时间。 RMI连接也没有错误。

1 个答案:

答案 0 :(得分:1)

您通过调用RequestForEntry来阻止事件处理线程,该调用应位于doInBackground的{​​{1}}方法中,例如

SwingWorker

Swing是一个单线程框架,并且不是线程安全的。这意味着Event Dispatching Thread的任何块都将阻止它处理新事件,包括绘制请求。

Swing组件也应该只在EDT的上下文中更新,这是public void actionPerformed(ActionEvent ev) //this is my action performed from a jframe window { try { final String option = (String) serversList.getSelectedItem(); if (evt.getSource().equals(Button1))//when client presses button1 { final WaitWindow waitWindow = new WaitWindow(); worker = new SwingWorker<Void, Void>() {//ia m creating a worker @Override protected Void doInBackground() throws Exception { if (option.equals("icsd Server")) {//here is my connection Registry registry = LocateRegistry.getRegistry("localhost", 1080); icsdserver = (ICSDinterface) registry.lookup("RmiCheckICSD"); worker.execute(); //i am calling execute until the server return 0 this might take a long time if (icsdserver.RequestForEntry("icsd", 0) == 0) { worker.cancel(true); //when server tell its all ok (with 0) i call cancel(true) AddGrade d = new AddGrade(icsdserver, "icsd"); } } return null; } @Override protected void done() { waitWindow.CloseWaitWindow(); } }; } } catch (RemoteException ex) { System.out.println(ex); } catch (NotBoundException ex) { System.out.println(ex); } } 的来源。

有关详细信息,请参阅Concurrency in SwingWorker Threads and SwingWorker