質問: ``` import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextArea; import javax.swing.JTextField; public class Enshu58 { JTextArea ta; JTextField tf; public static void main(String[] args) { new Enshu58(); } public Enshu58(){ JLabel lb; JFrame f; f=new JFrame(); f.getContentPane().setLayout(new FlowLayout()); f.setSize(600,100); lb=new JLabel(); ta=new JTextArea(5,20); tf=new JTextField(15); f.getContentPane().add(lb); f.getContentPane().add(ta); f.getContentPane().add(tf); tf.addActionListener(new Enshu58enter()); f.setVisible(true); } class Enshu58enter implements ActionListener{ public void actionPerformed(ActionEvent e){ ta.append("あ"); //テキストエリアに「あ」を追加 } } ```
回答: テキストフィールドからどうやって文字列を取得するか? JTextField#getText。 文字列のクリアを伴う際は、JTextField#setTextに空文字列を渡します。 **註: 実際にはこれらは親クラスJTextComponentのメソッドです。** * JTextComponent#getText()) * JTextComponent#setText(String)) clearみたいなメソッドがあるかと思ったんですが、見当たらないですね。 JTextComponent#cutだとクリップボードを汚染してしまいますし。 どうやってテキストフィールドにアクセスするか? 方法はいくつかあります。 1. **リスナークラスから直接ta及びtfにアクセスする方法** Enshu58enterはEnshuの内部クラスなので、taやtfにそのままアクセスすることができます。 意識されていないかもしれませんが、ご提示のコードでもtaにアクセスしていますよね。 2. **ActionEventからイベント元を獲得する方法** 既にdice142さんが回答されている方法です。 3. **リスナークラスにコンストラクタを用意し、ta及びtfを引き渡す方法** 最終的にフィールドとエリアの対を何組か作るならこの方法が有効です。 4. **ActionListenerの匿名クラスを作る方法** その場で使い捨てのリスナーを作ることができます。 5. **ラムダ式で匿名クラスを作る方法** 直前の方法と本質的には同じです。 理解したうえで書けるのなら、この方法が最も洗練されていると言えるでしょう。 一番簡単なのは 1 です。 3 ならリスナーを外部クラスに切り離すことができます。 簡潔さを求めるなら 5 です。 意図的に少し詳しめな回答にしました。 学習の進度に合わせていろんな方法にチャレンジしてみて下さい。