- ベストアンサー
JTextAreaへのアクセス方法について
- 外部クラスからJTextArea等のコンポーネントにアクセスする方法を教えてください。
- Threadを承継したクラスからJTextAreaにアクセスする方法についてアドバイスをお願いします。
- JTextAreaの表示を変えるために、外部のクラスからどのような処理をすればいいのか教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
二つの問題がごっちゃになってしまいかねないので、整理します。 1.あるクラスから別のクラスへのアクセスをどうするか? 2.イベント処理スレッド以外のスレッドからSwingコンポーネントへのアクセスの関する問題。 >もっとも、同じことは、イベントリスナクラスを、 >内部クラスではなく、外部クラスとして、記載した >時にも生じてしまいます。 このことから、今回、聞きたいことは1.の方かなと思いますので、まず、1.のほうから。 イベントリスナのクラスを外部クラスにすると、イベント元クラスのインスタンスへの参照がないため、アクセスできないって事ですよね。 ならば、参照を渡してしまえばいいと思います。 public class Button_Clicked implements ActionListener { private MainFrame owner; public Button_Clicked(MainFrame frame) { owner = frame; } public void actionPerformed(ActionEvent e) { owner.textArea.setText("ボタンが押されました。") } } このようにイベントリスナクラスをあらかじめイベント元クラスのインスタンスの参照を渡せるように作っておき、実際にこのクラスをnewするときに、自分自身を渡せばいいと思います。 public class MainFrame extends JFrame { public MainFrame() { ・・・ button.addActionListener(new Button_Clicked(this)); ・・・ } } Threadの場合も同じようにすればいいでしょう。 ただ、イベント処理スレッド以外のスレッドからのSwingコンポーネントへのアクセスには注意が必要です。 私もちょうど勉強中の所で、説明しようとするとすぐにぼろが出ると思うので、こちらを参考にしてください。 http://wisdom.sakura.ne.jp/system/java/swing/swing4.html (よく見たらJTextAreaのsetText()もappend()もスレッドセーフって書いてあるので今回はこの問題は関係ないですかね)
お礼
出来ました。 まさに、思い通りの動作です。 自分では、全く思いつきませんでした。 ありがとうございます(この際、2.の問題も 考えておきます)。