我试图弄清楚基于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)。为什么我们不能在构造函数中实例化文本区域?为什么我们不能在构造函数之外设置文本区域的参数? (只是为了保持一致性)。
答案 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
,而不是win
。 win
只是变量的名称。
是否有充分的理由进行实例化 外面的文本区域(m_resultArea) 构造函数然后设置它 参数(setText)内 构造
实例化可以在构造函数之外进行,但是setText()
之类的常规方法调用必须在另一个方法中进行。
但是 当班级的第一行是 执行(JTextArea m_resultArea = new JTextArea(6,30));。
该类的第一行在构造函数之前执行。
为什么我们无法实例化文本 构造函数中的区域?
你也可以,取决于你。
为什么我们不能设置参数 构造函数之外的文本区域? (只是为了保持一致性)。
正如我之前所说,循环,方法调用等必须在方法(构造函数,主函数或任何其他方法)中发生。
有关字段初始化的详细信息,请参阅Sun tutorial here。
答案 2 :(得分:1)
1- JTextArea的实例化是创建HelloWorldSwing对象时首先发生的事情。之后执行构造函数。因为它不是静态的,所以你不能在没有和对象的情况下访问它(在这种情况下,win)。
2-有一个很好的理由,但它可以在构造函数中实例化。就像那样,因为当你想使用它时,你确保它不是null。如果在实例化之前在构造函数中使用它,则会出现异常。它只是一种确保在构造类对象之前已经创建它的方法。
答案 3 :(得分:1)
创建HelloWorldSwing
对象时自动执行该行。在实际调用构造函数之前,该类的所有字段都已初始化。
你可以这样做。在这种情况下,由于resultArea
在构造函数中被修改,我也会将实例化放在构造函数中,但是IMHO是一个样式问题。在构造函数完成后,您也可以随时修改resultArea
的属性。
答案 4 :(得分:1)
1)不,你没有实例化“胜利”对象;您实例化一个HelloWorldSwing对象。实例变量已初始化before the body of the constructor runs。
2)没有理由不能在构造函数中实例化文本区域。您可以随时设置TextArea的各种属性。