Как работает приложение Swing Hello World? - PullRequest
0 голосов
/ 17 февраля 2010

Я пытаюсь выяснить, как работает приложение Hello World на основе Swing. Вот код, который у меня есть:

import java.awt.*;
import javax.swing.*;


public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);

        //====================================================== constructor
        public HelloWorldSwing() {
            //... Set initial text, scrolling, and border.
            m_resultArea.setText("Enter more text to see scrollbars");
            JScrollPane scrollingArea = new JScrollPane(m_resultArea);
            scrollingArea.setBorder(BorderFactory.createEmptyBorder(10,5,10,5));

            // Get the content pane, set layout, add to center
            Container content = this.getContentPane();
            content.setLayout(new BorderLayout());
            content.add(scrollingArea, BorderLayout.CENTER);
            this.pack();
        }

        //============================================================= main
        public static void main(String[] args) {
            JFrame win = new HelloWorldSwing();
            win.setTitle("TextAreaDemo");
            win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            win.setVisible(true);
        }


}

Код был взят из здесь (я немного его изменил). У меня есть два основных вопроса по поводу примера, но если вы ответите как минимум, один из них будет очень признателен. Вот мои вопросы:

1. Насколько я понимаю, «основной» метод запускается автоматически. В этом методе мы создаем экземпляр объекта «win» и, как следствие, конструктор класса будет выполнен. Но когда выполняется первая строка класса (JTextArea m_resultArea = new JTextArea (6, 30)) ;.

2. Есть хорошая причина для создания экземпляра текстовой области (m_resultArea) вне конструктора, а затем установить его параметры (setText) в конструкторе Почему мы не можем создать экземпляр текстовой области в конструкторе? Почему мы не можем установить параметры текстовой области за пределами конструктора? (Просто ради последовательности).

Ответы [ 5 ]

3 голосов
/ 17 февраля 2010

Примечание:

Это типичный пример того, где использование отладчика значительно поможет вам понять ход выполнения. Если вы не знаете, как использовать отладчик, я рекомендую эти отличные бесплатные видеоуроки для отладчика Eclipse.


Теперь, чтобы ответить на ваши вопросы:

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

Объект, который создается, имеет тип HelloWorldSwing, а не win. win это просто имя переменной.

Есть ли веская причина для создания экземпляра текстовая область (m_resultArea) снаружи конструктор, а затем установить его параметры (setText) в пределах Конструктор.

Инстанцирование может происходить вне конструктора, но обычные вызовы методов, такие как setText(), должны происходить внутри другого метода.

Но когда первая строка класса выполнено (JTextArea m_resultArea = new JTextArea (6, 30));.

Первая строка класса выполняется перед конструктором.

Почему мы не можем создать экземпляр текста площадь в конструкторе?

Ты тоже можешь, до тебя.

Почему мы не можем установить параметры область текста за пределами конструктора? (Только ради последовательности).

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

Дополнительную информацию об инициализации поля вы можете найти в руководстве Sun здесь .

3 голосов
/ 17 февраля 2010

Код, который вы разместили, нарушает правила потоков Swing. Код в методе main должен выполняться в потоке диспетчеризации событий и должен выглядеть так:

public static void main(String[] args) {
   SwingUtilities.invokeLater(new Runnable() {
          public void run() {
              JFrame win = new HelloWorldSwing();
              win.setTitle("TextAreaDemo");
              win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              win.setVisible(true);
          }
   });
}
1 голос
/ 17 февраля 2010
  1. строка выполняется автоматически при создании объекта HelloWorldSwing. Все поля класса инициализируются до , на самом деле вызывается конструктор.

  2. вы можете сделать это в любом случае. В этом случае, так как resultArea изменяется внутри конструктора, я бы также поместил инстанцирование внутри конструктора, но это IMHO проблема стиля И вы также можете изменять свойства resultArea в любое время после завершения конструктора.

1 голос
/ 17 февраля 2010

1) Нет, вы не создаете экземпляр объекта "win"; вы создаете экземпляр объекта HelloWorldSwing. Переменные экземпляра инициализируются до того, как тело конструктора выполнит .

2) Нет причины, по которой вы не можете создать экземпляр текстовой области в конструкторе. Вы можете в любое время установить различные свойства TextArea.

1 голос
/ 17 февраля 2010

1 - Создание JTextArea - это первое, что происходит при создании объекта HelloWorldSwing. Конструктор выполняется сразу после этого. Поскольку он не статичен, вы не можете получить к нему доступ и использовать объект (в данном случае win).

2 - есть веская причина, но ее можно создать в конструкторе. Это так, потому что таким образом вы гарантируете, что оно не равно нулю, когда вы хотите его использовать. Если бы вы использовали его в конструкторе до создания экземпляра, вы получите исключение. Это просто способ убедиться, что он уже создан до создания объекта класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...