4

私は現在、大学の 1 年生のプロジェクトに取り組んでいますが、非常に複雑な問題ではないかと思いますが、問題があります。

問題は 2 つのクラスに関するものです。gui クラス (class1) と別のクラス (class2) で、コードを実行すると、class1 から class2 の getText() 文字列を取得しようとすると、2 番目のクラスが nullpointerexception を返します。

class1 に JTextField があり、.getText() 値を class2 に渡して String 型変数に格納しようとしています。

これを達成しようとしている現在のコードは次のとおりです(簡略化):

 public class Class1 {

    private JTextField textField = new JTextField("Something");

      public Class1() {}
    ...
    public String getTextFieldString() {
      return textField.getText();
  }
}

 public class Class2 {

   public Class2(Class1 class1) {
    c1=class1
   }
    private c1 Class1 = new Class1();
    private String s = new String();
    ...
    s = c1.getTextFieldString();
}

私はコーディングにかなり慣れていません。おそらくどこかで引数を渡す必要があると読んだことがありますが、それは textField 自体が静的ではないためであり、誰かが新しい値を入力すると変化するためだと思います。(そこに明白なことを述べて申し訳ありません。)

とにかく、助けていただければ幸いです。どうもありがとう!

4

3 に答える 3

4

Java で規定されている 初期化順序を確認するのに役立つかもしれません。特に、textFieldインスタンス変数初期化子は、有効なClass1インスタンスが存在するまでに完了する必要があります。この順序に違反する 1 つの方法は、別のスレッドでClass1とを構築することです。Class2これを防ぐには、Swing GUI オブジェクトは、以下のsscceに示すように、イベント ディスパッチ スレッド上でのみ構築および操作する必要があります。

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/** @see http://stackoverflow.com/q/10067399/230513 */
public class NewJavaGUI extends JPanel {

    public NewJavaGUI() {
        Class1 class1 = new Class1();
        Class2 class2 = new Class2(class1);
        this.add(class1.textField);
        this.add(new JLabel(class2.s));
    }

    private static class Class1 extends Object {

        private final JTextField textField = new JTextField("Something");

        public Class1() {} // implicit

        public String getTextFieldString() {
            return textField.getText();
        }
    }

    private static class Class2 extends Object {

        private final Class1 c1;
        private final String s;

        public Class2(Class1 class1) {
            c1 = class1;
            s = c1.getTextFieldString();
        }
    }

    private void display() {
        JFrame f = new JFrame("NewJavaGUI");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new NewJavaGUI().display();
            }
        });
    }
}
于 2012-04-09T01:24:28.243 に答える
3

Class1への参照をコンストラクターに渡して属性に保存することができ、テキストが必要になるClass2たびに属性のメソッドを呼び出すだけです。Class2getText()

public class Class2 {
    private Class1 class1;
    public Class2(Class1 reference) {
        class1 = reference;
    }
    public void someMethod() {
        String s = class1.getTextFieldString();
    }
}

Class2オブジェクトをインスタンス化すると、次のようになります。

Class1 c1 = new Class1();
Class2 c2 = new Class2(c1);
于 2012-04-08T23:30:47.520 に答える
2

誰かがテキスト フィールドのテキストをいつ変更したかを知りたいとお考えのようですね。私の最初のアドバイスは、Swing コンポーネントについて特定の質問がある場合はいつでも Java チュートリアルを参照することです。具体的には、JTextField チュートリアルの addActionListener メソッド (テキスト デモの例を含む) を参照してください。

于 2012-04-08T23:29:28.657 に答える