1

我有一个带有一些变量和一些 SWING 小部件的 JFrame 应用程序。在其中,我创建了另一个类的实例并将 JFrame 传递给构造函数中的子级。从孩子那里,我可以引用变量,但不能引用小部件。为什么?

 // My JFrame
 public class Prot2Prom extends JFrame  {

    // My Child
    public Prot2Prom() {
    super( "Protocol To PROM" );
        Child child = new Child(this);

在 Child 类中,我的构造函数执行

 Prot2Prom frame = null;

 public Child(Prot2Prom gui) {
    frame = gui;
 }

以下作品:

 frame.<parent variable>=x;

以下没有:

 frame.textArea.append("Hello");

无法解析 textArea。都加了“新”。为什么我看不到他们?

4

2 回答 2

3

一些注意事项和建议:

  • 这与“小部件”或 Swing 无关,都与变量的可见性有关。我猜这textArea不是 Prot2Prom 类的公共领域。
  • 如果变量是公共的,外部类可以“看到”它们,访问它们,修改它们。
  • 一个可能的解决方案是实际上将您希望其他类看到的变量公开。
  • 一般来说,你真的不想这样做。
  • 相反,更好的是为类提供允许其他类调用的公共方法,并通过这样做来改变原始类的行为。换句话说,您的 Swing GUI 类应该像任何 Java 类一样遵守良好的 OOP 原则。
  • 稍后您会想要阅读 MVC 或模型视图控制设计模式,将代码的行为分离为单独的逻辑实体,这可以使您的代码更加灵活和强大。

编辑 1
关于您的评论:

“小部件”都是由 WindowsBuilder Pro 创建的。我正在尝试使用 textArea 为独立(jar)应用程序创建我的 Eclipse 控制台。如何从 Frame 实例化的类中打印到它?

您需要为保存 textArea 变量的类提供一个公共方法:

public void appendTextAreaText(String text) {
  textArea.append(text);
}

然后您的其他类可以将文本附加到 JTextArea。为什么这很重要?一个原因是,如果持有 textArea 的类有时不希望其他类能够附加到这个小部件,它可以有逻辑在方法中控制它。因此,它为持有它的类提供了对小部件的更多控制。

例如,

public void appendTextAreaText(String text) {
  if (allowTextAreaAppend) {  // a class boolean field 
    textArea.append(text);
  }
}

顺便说一句,我还建议您将代码生成工具放在一边,而是手动创建您的 Swing GUI,直到您牢牢掌握 Swing 和 Java 基础知识。这将使您将来更好地使用 Swing 代码生成工具并提高生产力。

于 2012-10-09T21:16:55.707 回答
2

textArea 无法解析

此消息表明在 中没有调用成员类textArea变量Prot2Prom。这可能是一个错字。也许该变量textarea仅在构造函数范围内被本地调用或定义。

工作你的课看起来像这样

public class Prot2Prom extends JFrame {

    JTextArea textArea = new JTextArea();
    ...

在父组件中更新文本的一种更好的方法是创建一个Prot2Prom这样的方法:

public void addText(String text) {
   textArea.append(text);
}

这提供了对如何将文本添加到JTextArea.

于 2012-10-09T21:26:47.260 回答