JPanel не отображается в JFrame - Java - PullRequest
2 голосов
/ 30 января 2010

Сервер - это созданный мной класс, расширяющий 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);

О черт, это просто внезапно сработало ... И я собирался снять этот вопрос, но я несколько раз задавал его снова и просто случайно РАБОТАЛ, а иногда НЕ РАБОТАЕТ.

Я только что вспомнил, что раньше сталкивался с этой проблемой с другими «проектами», и я решил сделать окно с изменяемым размером. Всякий раз, когда я просто изменял его размер, компоненты отображались.

На этот раз я делаю игру, и я не хочу, чтобы она изменялась в размере ... и я все равно хочу знать, как решить эту проблему навсегда и правильно.

Помощь! Кто-нибудь знает, почему это происходит?

Спасибо.

Edit:

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);

Это поможет?

Ответы [ 3 ]

4 голосов
/ 30 января 2010

Проблема не очевидна из предоставленного вами кода.

Звучит так, как будто вам нужна комбинация pack () , setSize (int, int) , setExtendedState (int) и / или setResizable (логическое) методы до вызова setVisible (true) .


Edit:

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

В этом коде есть условие гонки. Иногда основной поток переводит компоненты в правильное состояние для рисования до отображения кадра; иногда рама побеждает и начинает рисовать до того, как все будет готово.

Смысл использования Swing в том, что вы автоматически работаете с многопоточным кодом. Хотя обычно безопасно инициализировать элементы управления в главном потоке, как только вы заставляете запуск потока обработки событий (как наверняка сделает setVisible(true)), все ставки отключены.

Задержка вызова setVisible(true) как можно дольше. Желательно не вызывать его из вашего JFrame конструктора.

Если вам нужно изменить элементы управления Swing после того, как вы запустили свое приложение, вам нужно будет сделать это через поток рассылки событий (см. Методы invokeLater и invokeAndWait в SwingUtilities , среди прочих).

3 голосов
/ 30 января 2010

Периодические сбои такого рода предполагают проблемы с синхронизацией. Убедитесь, что вы создали и запустили свой графический интерфейс на EDT . Кроме того, вам может понравиться эта очень простая, ~ 100 строка, программа для чата GUI .

2 голосов
/ 30 января 2010

Вызов setVisible слишком ранний.Он запускается сразу и рисует окно в тот момент, когда он вызывается.Если вы не добавили все компоненты в рамку, они не будут окрашены.Вот почему изменение размера рамки, кажется, заставляет его появиться.Поскольку изменение размера приводит к выполнению перерисовки.

Сделайте setVisible последним вызовом в конструкторе JFrame.

...