0

編集:すべての回答をありがとう、本当に多くの素晴らしいヒントを助けてくれました。

こんにちは、私はここにいるのは初めてで、Java プログラミングも初めてなので、できる限り関連情報を提供しようと思います。

私の問題は、2 つのクラスを作成しようとしていることです。最初のクラス (ClassA) は GUI で、2 番目 (ClassB) は (ClassA) のロジックです。

私のコードの簡単な例は次のとおりです。

クラスA

import javax.swing.*;
import java.awt.*;

public class ClassA extends JFrame {


JTextField a = new JTextField();

JButton but = new JButton("Click");

ClassB cb = new ClassB();


public ClassA() {
    setTitle("Test");
    setLookAndFeel();
    setSize(250, 100);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout mainGrid = new GridLayout(1, 1, 20, 20);
    setLayout(mainGrid);


    add(a);
    add(but);
    but.addActionListener(cb);
    setVisible(true);
}


private void setLookAndFeel() {
    try {
        UIManager.setLookAndFeel(
                "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
                );
    } catch (Exception exc) {
        //ignore error
    }
}

public static void main(String[] args) {
    ClassA Alch = new ClassA();
}

}

クラスB

import java.awt.event.*;

public class ClassB implements ActionListener{
String command;
String text;

ClassA ca;



@Override
public void actionPerformed(ActionEvent event) {
    command = event.getActionCommand();
    if (command.equals("Click")) {
        text = ca.a.getText();
        System.out.println(text);
    }

}
}

私が抱えている問題は、 ClassB を取得して JTextField aを読み取ることです。

行を削除すると

text = ca.a.getText();

と使用

System.out.println(command);

クリックを出力するので、残りのコードは機能しているように見えますが、追加するとすぐに

text = ca.a.getText();

「クリック」ボタンを使用すると NullPointerException が発生します。

そこで問題は、ClassB に JTextField を読み取らせて出力させるコードをどのように記述すればよいかということです。

4

4 に答える 4

1

ClassA変数がありますcaが、まだ初期化していません。そのため、まずca変数を使用するために初期化する必要があります。

ClassA ca - new ClassA();

あなたの質問には関係ありませんが、あなたが言ったように、あなたはJavaが初めてです。ロジッククラス内にインターフェイスクラスのインスタンス変数を決して持たないことを常に覚えておいてください。悪いデザインです。

MVC 設計パターンに関する優れた記事をいくつか見つけてから、OOP に戻ることをお勧めします。強力な基盤を作成することは常に良いことです:)

于 2012-07-18T15:31:33.903 に答える
1

ca変数は初期化されませんでした。おそらくコンストラクターのClassA ca = new ClassA()どこかに追加する必要があります。ClassB

明確化編集

コメントごと:

変数がコンストラクター内で初期化される場合は、を使用する必要がありますca = new ClassA()。それ以外の場合、変数はコンストラクター内でのみスコープされます。たとえば、次のようになります。

public ClassB() {
    ca = new ClassA();
}

ただし、何らかの理由でコンストラクターを追加したくない場合は、変数の既存の宣言を変更することもできます。

public class ClassB implements ActionListener{
    String command;
    String text;
    ClassA ca = new ClassA();
    ...
}
于 2012-07-18T15:31:42.877 に答える
0

caを呼び出すことにより、ClassA のコンストラクターで ClassBのフィールドを初期化できますcb.ca = thisが、それはちょっと汚いです。ほとんどの場合、フィールドはプライベートにする必要があります。つまり、クラスの外からアクセスできないようにします。

これを解決する最善の方法は、ClassB を忘れて、代わりに匿名クラスを使用することです。ClassA のコンストラクターで、ActionListener の新しい匿名実装を追加します。

but.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent event) {
        command = event.getActionCommand();
        if (command.equals("Click")) {
            String text = a.getText();
            System.out.println(text);
        }
});

または、ClassB のコンストラクターへの引数としてラベルを指定し、それを (ClassB の) フィールドに保存することもできます。

private JTextField field;

public ClassB(JTextField field) {
    this.field = field;
}
于 2012-07-18T15:54:45.743 に答える
0

まず、 ClassB で ClassA のインスタンスを作成する必要があります。

ClassA ca = new ClassA();

次に、ca がインスタンス変数であることを知っておく必要があります。インスタンス変数を初期化しないと、null 値が取得されます。

ヒント: インスタンス変数を非公開にして、getter メソッドと setter メソッドでそれらにアクセスすることをお勧めします。

private JTextField txtField1 = new JTextField();

private JButton btnAction1 = new JButton("Click");

private ClassB cb = new ClassB();

public JTextField getTxtField1() {
    return txtField1;
}
于 2012-07-18T15:35:22.637 に答える