2012-07-04 205 views
0

我正在製作一個JFrame,它將從Internet上載入圖片。我有這個工作,但這個JFrame的問題是有很多圖片,所以他們需要很長時間才能加載。這很好,但我想向用戶展示圖片正在加載。出於某種原因,我無法讓JPanel在加載JFrame中顯示。我知道這是一個常見的錯誤,我已經嘗試了很多修復程序,但都沒有工作。這裏是代碼:JPanel不顯示在JFrame中

final JFrame weatherLoadPop=new JFrame("Loading weather..."); 
weatherLoadPop.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
weatherLoadPop.addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
     weatherPop.dispose(); 
    }; 
}); 
weatherLoadPop.setResizable(false); 
weatherLoadPop.setBounds(100,50,225,100); 
JPanel weatherLoadPanel=new JPanel(); 
weatherLoadPanel.setBackground(Color.RED); 

weatherLoadPanel.setPreferredSize(new Dimension(225,100)); 
JLabel weatherLoadLabel=new JLabel("Loading...0%"); 
weatherLoadPanel.add(weatherLoadLabel); 
weatherLoadPop.add(weatherLoadPanel); 
weatherLoadPop.pack(); 
weatherLoadPop.validate(); 
weatherLoadPop.setVisible(true); 

我不確定我正在使用pack()和validate()。我不經常使用它們。無論如何,刪除它們都無濟於事。對我來說,這個問題最奇怪的部分是加載圖片的JFrame工作得很漂亮,而JFrame加載更簡單。

感謝您的任何幫助。

回答

1

它在這裏工作得很好。也許你應該提供我們可以測試的sscce

我不得不改變你的事件監聽器處置weatherLoadPop代替weatherPop並添加你的代碼測試類:

package test; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Test { 

    public static void main(String[] args) { 
     final JFrame weatherLoadPop = new JFrame("Loading weather..."); 
     weatherLoadPop.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     weatherLoadPop.addWindowListener(new WindowAdapter() { 

      @Override 
      public void windowClosing(WindowEvent e) { 
       weatherLoadPop.dispose(); 
      } 
     ; 
     }); 
     weatherLoadPop.setResizable(false); 
     weatherLoadPop.setBounds(100, 50, 225, 100); 
     JPanel weatherLoadPanel = new JPanel(); 
     weatherLoadPanel.setBackground(Color.RED); 

     weatherLoadPanel.setPreferredSize(new Dimension(225, 100)); 
     JLabel weatherLoadLabel = new JLabel("Loading...0%"); 
     weatherLoadPanel.add(weatherLoadLabel); 
     weatherLoadPop.add(weatherLoadPanel); 
     weatherLoadPop.pack(); 
     weatherLoadPop.validate(); 
     weatherLoadPop.setVisible(true); 
    } 
} 

和我得到:使用

Loading....

java version "1.7.0_04" 
Java(TM) SE Runtime Environment (build 1.7.0_04-b20) 
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode) 
+0

Thanks Qsp。不太清楚ssce是什麼。我點擊鏈接並閱讀該頁面,但不是您提供ssce的代碼?我會釋放更多的代碼,但我的程序是封閉的源代碼。 在註釋掉其餘的函數之後,它就起作用了。實際上它總是在工作,但是JPanel直到包含它的函數完成才顯示。我從來沒有見過JPanel顯示,因爲我在函數結束之前調用了dispose()。 爲什麼它在顯示JPanel之前等待函數完成,我該如何解決這個問題? 非常感謝您的幫助, Cameron –

+0

SSCCE正是我發佈的內容,您應該自己做,讓人們更快地幫助您(他們不需要準備課程並且可以複製-past和測試/修復你的代碼)。 –

+0

看看這個[很好的答案](http://stackoverflow.com/a/9976255/856202)上的類似問題。如果我正確理解你的話,那麼當你的函數執行操作正在執行時,你的擺動線程會凍結。所以你應該在一個新的線程中啓動你的函數,從而防止JPanel顯示上的鎖定。如果你需要進一步的幫助,請說。 –