[英]JPanel not displaying in JFrame - Java
Server是我制作的擴展JFrame的類。
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);
哦dang,它只是突然工作......我正要刪除這個問題,但我再次運行它幾次,只是隨機工作,有時不工作。
我剛才記得在使用其他'項目'之前遇到這個問題,我的解決方案是讓窗口可以調整大小。 每當我簡單地調整它的大小時,組件就會顯示出來。
這一次,我正在制作一個游戲,我不希望它可以調整大小......而且我想知道如何以正確的方式解決這個問題。
救命! 有誰知道為什么會這樣?
謝謝。
編輯:
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);
這會有幫助嗎?
從您提供的代碼中,問題並不明顯。
在調用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控件,則需要通過事件調度線程來執行此操作(請參閱SwingUtilities中的invokeLater
和invokeAndWait
方法等)。
對setVisible的調用太早了。 它會立即運行並在調用窗口時繪制窗口。 如果尚未將所有組件添加到框架中,則它們不會被繪制。 這就是為什么調整框架的大小似乎使它出現。 因為調整大小會導致重繪執行。
使setVisible成為JFrame構造函數中的最后一次調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.