2010-01-30 80 views
2

服務器是我製作的擴展JFrame的類。JPanel不顯示在JFrame中 - Java

Server serverApp = new Server(TITLE, WIDTH, HEIGHT, true, false); 

我已經有效地刪除了幾乎所有其他的代碼,但問題仍然存在!

c = getContentPane(); 
    c.setLayout(new BorderLayout()); 

    //Components /***AHHHHH***/ 
    lblEnterMessage = new JLabel("Enter Message "); 
    txtEnterMessage = new JTextField(50); 
    txtEnterMessage.addActionListener(this); 
    btnSend = new JButton("Send"); 
    btnSend.addActionListener(this); 
    taDisplay = new JTextArea("Test, test test.", 10, 0); 
    taDisplay.setEditable(false); 
    JScrollPane jspDisplay = new JScrollPane(taDisplay); 

    pnlChatTop = new JPanel(new FlowLayout()); 
    pnlChatTop.add(lblEnterMessage); 
    pnlChatTop.add(txtEnterMessage); 
    pnlChatTop.add(btnSend); 
    pnlChat = new JPanel(new BorderLayout()); 
    pnlChat.add(pnlChatTop, BorderLayout.CENTER); 
    pnlChat.add(jspDisplay, BorderLayout.SOUTH); 

    c.add(pnlChat, BorderLayout.CENTER); 

哦宕,它只是忽然保護正常工作......我正要刪除這個問題,但我又跑了它幾次,只是隨機WORKS,有時無法正常工作。

我剛剛記得以前有過其他'項目'這個問題,我的解決方案是使窗口可調整大小。每當我簡單調整它的大小時,組件都會顯示。

這次,我正在製作一款遊戲,我不希望它可以調整大小......我想知道如何以正確的方式解決這個問題。

幫助!有誰知道爲什麼會發生這種情況?

謝謝。

編輯:

public Server(String title, int sizeW, int sizeH, boolean visibility, boolean resizability) { 

    /* Initialization */ 
    //JFrame settings 
    setTitle(title); 
    setSize(sizeW, sizeH); 
    setVisible(visibility); 
    setResizable(resizability); 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    addKeyListener(this); 
請問

幫助?

回答

4

從您提供的代碼中,問題不明顯。

這聽起來像你想打電話setVisible(true)之前的pack()setSize(int,int)setExtendedState(int)和/或setResizable(boolean)方法的一些組合。


編輯:

setTitle(title); 
setSize(sizeW, sizeH); 
setVisible(visibility); 
setResizable(resizability); 
setLocationRelativeTo(null); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

有在此代碼中的競爭條件。有時主框架會在框架顯示之前使組件進入正確的狀態以供繪製;有時框架會在所有事情都準備好之前贏得並開始繪畫。

關於使用Swing的一點是您自動使用多線程代碼。雖然在主線程上初始化控件通常是安全的,但一旦導致事件調度線程開始(因爲setVisible(true)肯定會這樣做),所有投注都將關閉。

儘可能延遲撥打setVisible(true)。最好不要在您的JFrame構造函數中調用它。

如果您需要修改Swing控件你已經拉開序幕後,您的應用程序,你需要通過事件調度線程(見invokeLaterinvokeAndWait方法SwingUtilities等等)來做到這一點。

+0

那麼我應該先設置RESIZABILITY?可見性?難道那......出於某種原因是問題所在? 好吧我只是嘗試pack(),setSize已經存在,setExtendedState(JFrame.ALL_DONT_WORK)和setResizable(false)都在調用setVisible(true)之前,它不起作用。 我還想超雙三重四注意,這發生在我的其他應用程序,我setResizable(false)等,使其顯示...我記得我的講師說她有同樣的問題之前,她只是調整它來修復它。 – Dois 2010-01-30 13:03:26

+1

@Dois - 看看Swing教程中的併發 - http://java.sun.com/docs/books/tutorial/uiswing/ – McDowell 2010-01-30 13:07:14

+0

調用invokeLater中的JFrame(我的服務器類)似乎工作。謝謝阿湯人,節省了我很多時間,並治好了我的頭痛。 – Dois 2010-01-30 13:18:54

3

此類間歇性故障提示同步問題。一定要在EDT上構建並運行GUI。另外,你可能會喜歡看到這個非常簡單的〜100行,GUI chat program

+0

謝謝,就是這樣。 – Dois 2010-01-30 13:16:59

2

對setVisible的調用爲時尚早。它立即運行,並在調用它時繪製窗口。如果您沒有將所有組件添加到框架,那麼它們不會被繪製。這就是爲什麼調整框架似乎讓它出現。因爲調整大小會導致重新繪製執行。

使setVisible成爲您的JFrame構造函數中的最後一個調用。

+0

其實,最初當我遇到問題時,我認爲這可能是問題,但我實際上有一個循環運行60次,每秒鐘爲我的容器調用repaint,所以我排除了這一點。 也許我的記憶籠罩着什麼,但無論如何,SwingUtilities.invokeLater似乎是完美的。多謝你們。 – Dois 2010-01-30 13:22:50