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 とは関係なく、すべて変数の可視性と関係があります。これはProt2Prom クラスのpublictextAreaフィールドではないと思います。
  • 変数がクラス外で公開されている場合、それらを「見る」、アクセスする、変更することができます。
  • 考えられる解決策は、他のクラスに見せたい変数を実際に public にすることです。
  • 一般的に、あなたは本当にこれをしたくありません
  • 代わりに、他のクラスが呼び出せるようにする public メソッドをクラスに与え、それによって元のクラスの動作を変更する方がはるかに優れています。つまり、Swing GUI クラスは、他の Java クラスと同様に、適切な OOP 原則に準拠する必要があります。
  • 後で、コードの動作を個別の論理エンティティに分離する方法として、 MVCまたはモデル、ビューコントロールの設計パターンを読みたいと思うでしょう。これにより、コードをより柔軟で強力にすることができます。

編集 1
あなたのコメントについて:

「ウィジェット」はすべて WindowsBuilder Pro によって作成されます。textArea を使用して、スタンドアロン (jar) アプリケーション用の Eclipse コンソールを作成しようとしています。フレームによってインスタンス化されたクラスからどのように印刷できますか?

textArea 変数を保持するクラスにパブリック メソッドを指定する必要があります。

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

次に、他のクラスが JTextArea にテキストを追加できます。何でこれが大切ですか?理由の 1 つは、textArea を保持するクラスが、他のクラスがこのウィジェットに追加する機能を許可したくない場合がある場合、メソッドでこれを制御するロジックを持つことができることです。したがって、ウィジェットを保持するクラスは、ウィジェットをより詳細に制御できます。

例えば、

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

余談ですが、Swing と Java の基礎をしっかりと理解するまで、コード生成ツールを脇に置いて、代わりに Swing GUI を手作業で作成することをお勧めします。これにより、今後 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 に答える