JFrame孩子看不到父widgits

时间:2012-10-09 21:00:37

标签: java swing oop

我有一个带有一些变量和一些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。全都添加了“新”。为什么我不能看到它们?

2 个答案:

答案 0 :(得分:3)

一些注意事项和建议:

  • 这与“小部件”或Swing无关,而与变量的可见性无关。我猜测textArea不是Prot2Prom类的 public 字段。
  • 如果变量是公共的,那么外面的类可以“看到”它们,访问它们,修改它们。
  • 一种可能的解决方案实际上是让你希望其他类看到的变量是public。
  • 一般来说,你真的想要这样做。
  • 相反,更好的方法是给一个允许其他类调用的类公共方法,并通过这样做来改变原始类的行为。换句话说,您的Swing GUI类应遵循良好的OOP原则,就像任何Java类一样。
  • 稍后你会想要阅读MVC或 M odel, V iew, C ontrol设计模式作为一种方式将代码的行为分离为单独的逻辑实体,这可以使您的代码更加灵活和强大。

编辑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代码生成工具。

答案 1 :(得分:2)

  

textArea无法解析

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

上课时看起来像这样

public class Prot2Prom extends JFrame {

    JTextArea textArea = new JTextArea();
    ...

更新父组件中文本的更好方法是创建Prot2Prom方法,如下所示:

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

这可以更好地控制文本添加到JTextArea的方式。