2012-03-29 208 views
1

我試圖在用戶在我的應用程序中單擊某個特定按鈕時在新的JFrame中顯示加載圖像。顯示JFrame,但它沒有顯示任何內容,也有白色背景,而所有JFrames有一個灰色的默認背景。這裏有什麼錯誤?沒有顯示Jframe內容

stop.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      analyzer.running=false; 
      JFrame Load1=new JFrame("Load1"); 
      ImageIcon icon1=new ImageIcon("./ajax-loader.gif"); 
      System.out.println(icon1.getIconHeight()); 
      Load1.add(new JLabel("Retrieving...", icon1, JLabel.CENTER),BorderLayout.CENTER); 
      Load1.pack(); 
      Load1.setSize(400,400); 
      Load1.setVisible(true); 

      System.out.println("Start Processing"); 
      parser.parse(); // Time Consuming method 


      nw_Creator.create(); 
      System.out.println("End Processing"); 
      Load1.setVisible(false); 

      home.setVisible(false); 
      screen2.setVisible(true); 

     } 
    }); 
+0

我沒有看到icon1被添加到有問題的JFrame? – vaisakh 2012-03-29 18:05:50

+0

對不起,我剛貼上了相關的代碼。誤了這行。 – nikel 2012-03-29 18:10:26

+0

這不是你的問題的答案,但我注意到你正在調用pack()和setSize()。調用這兩種方法是不合適的。調用pack()或setSize()但不是兩者。 pack()方法將根據內容設置大小。在極少數情況下,無法確定內容的大小,在這種情況下,您將刪除對pack()的調用並顯式調用setSize()。 – Michael 2012-03-29 20:55:00

回答

4

請勿將耗時的零件放入事件處理程序或在事件分派線程中運行的任何方法。您可能需要改用swing worker

+0

你能告訴我這裏發生了什麼?JFrame是在CPU密集型任務之前繪製的,所以它應該被顯示,對嗎? – nikel 2012-03-29 18:06:42

+2

@nikel不幸的是,事件調度是一項相當複雜的任務。雖然你的代碼看起來是正確的,並且方法的順序是正確的,但是繪製框架和觸發操作的處理方式卻完全不同。像'setVisible'或其他方法自己創建事件並將它們排入事件隊列。只有在一個事件(在這種情況下動作偵聽器處理)完成後,下一個事件纔會開始。簡而言之,JFrame在CPU密集型任務之前是*不*畫的,但之後。 – Howard 2012-03-29 18:10:47

+0

「SwingWorker」的+1。另請參閱此相關的[示例](http://stackoverflow.com/a/4530659/230513)。 – trashgod 2012-03-29 19:48:46

1

發生的事情是,你永遠不會釋放UI線程,所以你的JFrame永遠不會被繪製。由於所有圖形操作都是在UI線程上完成的,因此您必須釋放它,進行計算,然後關閉該框架(如果您希望jframe顯示任何內容)。

+0

你能更精緻一點嗎? – nikel 2012-03-29 18:10:45