簡體   English   中英

JPanel沒有在JFrame中顯示 - Java

[英]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中invokeLaterinvokeAndWait方法等)。

這種間歇性故障表明同步問題。 確保在EDT上構建並運行GUI。 此外,您可能希望看到這個非常簡單的~100行GUI 聊天程序

對setVisible的調用太早了。 它會立即運行並在調用窗口時繪制窗口。 如果尚未將所有組件添加到框架中,則它們不會被繪制。 這就是為什么調整框架的大小似乎使它出現。 因為調整大小會導致重繪執行。

使setVisible成為JFrame構造函數中的最后一次調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM