0

テキストフィールドを含むクラスがあり、そのクラス内にアクション実行メソッドを含む内部クラスがあります。テキストを入力して Enter キーを押すと、アクション リスナーを実装する内部クラスの外部にある文字列 "s" にテキストを割り当てたいと思います。その文字列を別のクラスで使用したい。

public class Peaches extends JFrame {
    private JTextField item1;

    public Peaches() {
        super("the title");
        setLayout(new FlowLayout());        
        item1 = new JTextField(10);
        add(item1);

    thehandler handler = new thehandler(); //object of thehandler inner class
    item1.addActionListener(handler);      

    // I want to use the textfield content here, or in other classes, updated
    // with the new text everytime i hit enter after entering new text in the textfield 

    //String s = the content of the textfield
}

private class thehandler implements ActionListener { // inner class
    @Override
    public void actionPerformed(ActionEvent event) {
        String string = "";           
        string = String.format(event.getActionCommand());            
        JOptionPane.showMessageDialog(null, string);           
    }
}

これを行う方法はありますか?プログラムの他の部分でテキスト フィールドの入力を使用できる必要があります。私は自分自身を明確にすることを願っています、ありがとう。

編集 返信ありがとうございます。変数文字列をコンストラクターで宣言する代わりにクラス変数にすることで、クラス全体がアクセスできるようになります。単純ですが、理解できませんでした。ありがとうマルコ

4

5 に答える 5

4

次のようにすることをお勧めします。

public class Peaches extends JFrame {
  private JTextField item1;
  private String string;

  public Peaches() {
    super("the title");
    setLayout(new FlowLayout());
    item1 = new JTextField(10);
    add(item1);
    item1.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent event) {
        string = String.format(event.getActionCommand() );
        JOptionPane.showMessageDialog(null, string);
    }});
  }
}

これは匿名クラスを使用しており、何十もの内部クラスを持つよりも簡単です。さらに、これらを使用してクロージャーを作成できます (匿名クラスの外部で宣言されたローカル変数を使用します)。あなたの文字列は外にあるので、アクセスできます。

于 2012-04-25T21:22:24.700 に答える
1

ここで、または他のクラスで、テキストフィールドに新しいテキストを入力した後にEnterキーを押すたびに新しいテキストで更新されたテキストフィールドのコンテンツを使用したい

ここでの簡単な答えは、テキストフィールドの値が変更されるたびにコードを実行したい場合は、リスナーをテキストフィールドにアタッチし、リスナーを介してそのコードをトリガーする必要があるということです。それがリスナーの目的です...テキストが変更されたことを知っているのはテキストフィールドだけであり、変更が行われたという事実をリスナーに通知します(オブザーバーパターン

複数のクラスでこの変更について通知を受けたい場合は、次のいずれかを実行できます。

  • 現在のクラスの外部からこの特定のテキスト フィールドにリスナーをアタッチするための API を提供する
  • 現在のクラスの外部からテキストフィールドに直接アクセスできる API を提供する
  • ある種のモデルを更新するテキストフィールドに 1 つのリスナーをアタッチし、異なるクラス間でモデルを共有します。もちろん、モデルはイベントを起動してリスナーに変更を通知できる必要があります。そうしないと、値がいつ変更されたかを知ることができなくなります。

内部クラス、匿名クラス、本格的なクラスをリスナーとして使用するかどうかは、実際には問題ではありません。

于 2012-04-25T21:34:49.687 に答える
0

You shouldn't need an inner class at all. Just implement an ActionListener in Peaches and have it listen for the ActionEvent:

public class Peaches extends JFrame implements ActionListener
{
    private JTextField item1;

    public Peaches()
    {
        super("the title");
        setLayout(new FlowLayout());        
        item1 = new JTextField(10);
        add(item1);

        item1.addActionListener(this);      
    }

    public void actionPerformed(ActionEvent event)
    {
        if (event.getSource() == item1){
            String string = "";           
            string = String.format(event.getActionCommand() );            
            JOptionPane.showMessageDialog(null, string);   
        }        
    }
}
于 2012-04-25T21:37:35.197 に答える
0

s をメソッド変数ではなくクラス変数に移動すると (現在、コンストラクターでコメントアウトされているため)、機能します。

于 2012-04-25T21:14:18.493 に答える
0

内部クラスのコンストラクターで外部クラスをパラメーターとして渡すことができます。

于 2012-04-25T21:14:40.327 に答える