Swing Hello World应用程序如何工作?

时间:2010-02-17 15:42:21

标签: java swing user-interface

我试图弄清楚基于Swing的Hello World应用程序是如何工作的。这是我的代码:

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


}

代码来自here(我略微修改了它)。关于这个例子我有两个主要问题,但如果你在leas回答,其中一个人会非常感激。这是我的问题:

1。据我所知,“main”方法是自动运行的。在这个方法中,我们实例化一个“win”对象,结果将执行该类的构造函数。但是当该类的第一行被执行时(JTextArea m_resultArea = new JTextArea(6,30));.

2。是否有充分的理由在构造函数外部实例化文本区域(m_resultArea),然后在构造函数中设置其参数(setText)。为什么我们不能在构造函数中实例化文本区域?为什么我们不能在构造函数之外设置文本区域的参数? (只是为了保持一致性)。

5 个答案:

答案 0 :(得分:3)

您发布的代码违反了Swing线程规则。 main方法中的代码必须在Event Dispatch Thread上运行,并且应该如下所示:

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 :(得分:3)

旁注:

这是一个典型示例,使用调试器将极大地帮助您了解执行流程。如果您不知道如何使用调试器,我建议将这些great free video tutorials用于Eclipse调试器。


现在,回答你的问题:

  

据我所知,“main”方法是自动运行的。在这   方法我们实例化一个“win”对象   并且,因此构造函数   该课程将被执行。

实例化的对象属于HelloWorldSwing,而不是winwin只是变量的名称。

  

是否有充分的理由进行实例化   外面的文本区域(m_resultArea)   构造函数然后设置它   参数(setText)内   构造

实例化可以在构造函数之外进行,但是setText()之类的常规方法调用必须在另一个方法中进行。

  

但是   当班级的第一行是   执行(JTextArea m_resultArea = new   JTextArea(6,30));。

该类的第一行在构造函数之前执行。

  

为什么我们无法实例化文本   构造函数中的区域?

你也可以,取决于你。

  

为什么我们不能设置参数   构造函数之外的文本区域?   (只是为了保持一致性)。

正如我之前所说,循环,方法调用等必须在方法(构造函数,主函数或任何其他方法)中发生。

有关字段初始化的详细信息,请参阅Sun tutorial here

答案 2 :(得分:1)

1- JTextArea的实例化是创建HelloWorldSwing对象时首先发生的事情。之后执行构造函数。因为它不是静态的,所以你不能在没有和对象的情况下访问它(在这种情况下,win)。

2-有一个很好的理由,但它可以在构造函数中实例化。就像那样,因为当你想使用它时,你确保它不是null。如果在实例化之前在构造函数中使用它,则会出现异常。它只是一种确保在构造类对象之前已经创建它的方法。

答案 3 :(得分:1)

  1. 创建HelloWorldSwing对象时自动执行该行。在实际调用构造函数之前,该类的所有字段都已初始化

  2. 你可以这样做。在这种情况下,由于resultArea在构造函数中被修改,我也会将实例化放在构造函数中,但是IMHO是一个样式问题。在构造函数完成后,您也可以随时修改resultArea的属性。

答案 4 :(得分:1)

1)不,你没有实例化“胜利”对象;您实例化一个HelloWorldSwing对象。实例变量已初始化before the body of the constructor runs

2)没有理由不能在构造函数中实例化文本区域。您可以随时设置TextArea的各种属性。