Противоречивые результаты в Eclipse для Java Swing

#java #eclipse #swing

#java #eclipse #swing

Вопрос:

Я сам изучаю Java и читаю «Справочник по Java All in One Desk для чайников». В настоящее время я использую код, приведенный в книге, для практики Swing. Вот код, который я использую, взятый из книги: `import javax.swing.*;

 public class JavaBook6 extends JFrame
{



public static void main(String[] args) 
{
     new JavaBook6();

}

public JavaBook6()
{
    this.setSize(400, 400);
    this.setLocation(500, 0);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setTitle("Sample");
    this.setVisible(true);


    JPanel pnlMain = new JPanel();
    JCheckBox chkMy = new JCheckBox("Save");
    JButton btnMy = new JButton("Search");
    JTextField txtMy = new JTextField(20);

    pnlMain.add(chkMy);
    pnlMain.add(txtMy);
    pnlMain.add(btnMy);
    this.add(pnlMain);




}
}
  

Кажется, я получаю противоречивые результаты, когда нажимаю выполнить. Всегда отображается окно. Однако иногда в окне отображается только заголовок фрейма, а в других случаях, как я и ожидал, отображаются такие компоненты, как JCheckBox, JTextArea и JButton.

Мой вопрос в том, почему компоненты отображаются иногда, а другие нет? Я пробовал использовать другие компоненты и получаю те же противоречивые результаты.

Как я уже говорил, я новичок и поэтому имею очень базовое представление о том, как работает Java, поэтому, пожалуйста, простите меня, если ответ на мой вопрос очевиден.

Комментарии:

1. Нет, причина совсем не очевидна. Используете ли вы eclipse в режиме отладки… Единственное, о чем я мог подумать, это случайная точка останова, которую вы, возможно, не заметили, или какая-то проблема с блокировкой потока. Попробуйте свою программу из командной строки (используя java command).. Посмотрите, возникает ли проблема.

2. Проблемой оказалось размещение ‘this.setVisible(true)’, но спасибо вам за идеи.

Ответ №1:

Я не слишком впечатлен учебником:

  1. Графический интерфейс должен быть создан на EDT. Прочитайте раздел из руководства Swing по параллелизму для получения дополнительной информации. Я бы также рекомендовал вам использовать примеры из руководств, поскольку они включают предложения из руководства.

  2. Компонент должен быть добавлен в графический интерфейс перед вызовом метода setVisible (true). (Есть способы обойти это, но пока сделайте это простым и следуйте этому правилу).

Комментарии:

1. Установка ‘setVisible(true);’ после добавления компонентов, похоже, устранила проблему. Большое спасибо за вашу помощь. К вашему сведению, я попробовал ссылку, на которую вы ссылались в своем предыдущем посте, но она показалась мне немного запутанной для такого новичка, как я. Однако я раньше не слышал об EDT, так что, похоже, мне нужно провести некоторое исследование. 🙂

Ответ №2:

Обычно вам нужно выполнить…

 this.pack();
  

прежде чем он отобразит все.

Я подозреваю, что если вы измените размер окна, все отобразится?

Добавление pack() указывает менеджеру компоновки расположить и увеличить все компоненты. Кроме того, если вы измените размер окна или каким-либо образом принудительно его обновите, в нем также будут отображаться компоненты.

Комментарии:

1. Только что подтвержденное добавление this.pack() в конец исправляет это.

2. Привет, ребята, спасибо, что помогли мне. Я пытался использовать this.pack(), и это действительно показало согласованные результаты, однако мне приходится каждый раз изменять размер окна, что является проблемой. Установка setVisible (true); после добавления компонентов, похоже, устранила проблему. Еще раз спасибо за вашу помощь.

3. Как только вы начнете использовать менеджеры компоновки, вам нужно будет выполнить pack(), причина, по которой вам нужно изменять размер после pack(), заключается в том, что pack фактически подгоняет размер каждого компонента к предпочтительному размеру, поэтому он делает именно то, что должен делать.