JTextAreaへのアクセス方法について

このQ&Aのポイント
  • 外部クラスからJTextArea等のコンポーネントにアクセスする方法を教えてください。
  • Threadを承継したクラスからJTextAreaにアクセスする方法についてアドバイスをお願いします。
  • JTextAreaの表示を変えるために、外部のクラスからどのような処理をすればいいのか教えてください。
回答を見る
  • ベストアンサー

外部クラスから、JTextArea等のコンポーネントへのアクセス

外部のクラスから、main()のあるクラスの JTextArea等のコンポーネントにアクセスし、 setText(),append()などで、表示を変えるには、 どうしたらいいのでしょうか。 現在は、Threadを承継したクラスから、呼び出し元 のクラスのJTextAreaにアクセスしたいのです。 もっとも、同じことは、イベントリスナクラスを、 内部クラスではなく、外部クラスとして、記載した 時にも生じてしまいます。 たとえば、そのコンポーネントだけ、staticにする ということも考えられますが、なにか記載がおかしい 気がします。 なにかアドバイスがありましたら、お願いします。

noname#10667
noname#10667
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.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()もスレッドセーフって書いてあるので今回はこの問題は関係ないですかね)

noname#10667
質問者

お礼

出来ました。 まさに、思い通りの動作です。 自分では、全く思いつきませんでした。 ありがとうございます(この際、2.の問題も 考えておきます)。

関連するQ&A

  • 外部クラスにアクセス

    例えばAクラスで宣言した外部クラス、BクラスとCクラスがあったとします。 例えばそのBクラスから(Aクラスで宣言されて実行中の)Cクラスにアクセス する方法はないでしょうか? 内部クラスにはしたくありません。知っているという方は教えて下さい。もし なければないで結構ですので、それも教えて下さい。お願いします。

    • ベストアンサー
    • Java
  • イベントリスナーのクラスの書きどころ

    まだまだ勉強したての超初心者で拙い質問ですが、宜しくお願い致します。 AWTのFrameクラスで参考書など何も無く勉強をしていたのですが、 イベントリスナーのクラスをどこに記述するのが一番良いのか、分かりません。 BaseFrameクラス、AFrameクラス、BFrameクラスが存在し、AFrame、BFrameはBaseFrameを継承しているとします。 windowOpened()の基本となる動作(「abc」という文字列を出力とする)はBaseFrameクラスの内部クラスに記述、 その後、AFrameクラスから実行されたFrameの場合は「abc」と出力された後に「def」と出力したい。 BFrameクラスから実行されたFrameの場合は「ghi」と出力された後に「abc」と出力したい。 とした時、AFrameクラスの方はAFrameの内部クラスで定義し、addWindowListener()により追加すれば実現出来たのですが、 BFrameクラスの場合は初めにBaseFrameクラスのwindowOpened()が実行されるので実現出来ません。 とすると、BaseFrameクラスにあるイベントリスナーの内部クラスから、 AFrame・BFrameクラスで実現したいイベントリスナーのクラスまで、 全てを完全に切り分けた方が良いのか?(切り分ければ可能だと思った) しかし、そうすると、他のコントロールについても同じ対応が必要であり、 コントロールとイベントの関連性が不透明化しないか?などと考えてしまい、 どうするのが一番か悩んでいます。どなたかご教示下さい。

    • ベストアンサー
    • Java
  • VB6で外部から静的アクセスが可能な定数

    VB6で(正確にはExcelVBAですが)ちょっとプログラムを組んでいるのですが、 クラス内で、外部からアクセス可能な静的定数を宣言を行いたいのですが、 宣言方法が分からず止まってしまいました。 出来たかどうかも記憶にありません・・・。調べても分からず;; Static Const var As String = "hoge" みたいな事をしたいんですが、やり方が分かる方ご教示下さい。

  • ネストトップクラス・メンバクラスについて

    現在、SJC-P取得に向け独学でJavaの勉強中です。 ネストクラス・インナークラスについて勉強している最中なのですが、 数冊テキストを読み込んでも、web検索をしても、イマイチよくわからない・・・というのが正直なところです。 どのクラス(アウタークラス/staticインナークラス/非staticインナークラス)の、 どういうメンバ(static/非static/private/final)が、 どのクラスのどういうメンバにアクセス出来るのかが整理しきれません・・・。 わからないなりに、まとめてみたのですが、理解が不十分で、かつ、この下記の通りの理解で正しいのかどうかもわかりません。 (言葉でうまく表現も出来ていない箇所も・・) また理解すべきポイントに不足があるかと思います。 どこが正しく理解出来ているのか・どこがどう間違っているかの指摘及びその内容・理解不足の箇所・よりわかりやすい例の追加や補記など、どうかよろしくお願い致します。 ●staticなインナークラス(=ネストトップクラス)について ・アウタークラスのインスタンスなしに、staticなインナークラスのインスタンスの生成が出来る。 ・staticなインナークラスからはアウタークラスの非staticメンバを直接アクセス出来ない。 (→ただし、staticアウターメンバになら直接アクセス出来る?staticであればprivateでもアクセス可?) ・staticなメソッド内で非staticなインナークラスのオブジェクトが生成出来ない。 ●非staticなインナークラス(=メンバクラス)について ・非staticなインナークラス内にstaticなメンバを持つことは出来ない。 ・アウタークラスのインスタンスを生成してからでないと非staticなインナークラスのインスタンスは生成出来ない。 ・アウタークラスの非staticメンバ及びstaticメンバに直接アクセス出来る。 ●アウタークラス(=外部クラス)について ・アウタークラスのstaticメソッド内で非staticなインナークラスのインスタンスは生成出来ない。 ・非staticインナークラスのメンバ及び、staticなインナークラスのメンバにアクセス出来る。 --------------------------------------------------------- (例)処理はさておき、定義はこんな感じを思い描いております・・ class Outclass{   private int aa;   private static int bb;   private outMethod1();   private static outMethod2();   class NotStaticInner{     private int cc;     //private static int dd;//不可     private inNotStaicMethod1();     //private static inNotStaticMethod2();//不可   }   class StaticInner{     private int ee;     private static int ff;     private inStaticMethod1();     private static inStaticMethod2();   } } 参考テキスト: 『Sun Certified Programmer for Java2 Platform5.0 Exam【310-055】』のChapter11:「ネストクラス・インナークラス」 参考URL: http://wisdom.sakura.ne.jp/programming/java/java46.html

  • java内部クラスについて

    内部クラスがstaticな場合 public class mainclass{   public static void main(String[] args) {     innerClass ic = new innerClass();   }   public static class innerClass{   } } と innerClass ic = new innerClass();で動作しnewできますが、 class が static でない場合どういう書き方になりますでしょうか? 色々と理解不足がある状況だとおもいますがよろしくお願いいたします。

  • mainクラス内に書いたメソッドの宣言の仕方(staticの必要性)

    java を勉強中の超初心者です、宜しくお願いします。 main と同じクラスに disp というメソッドを作成してやり、” void disp(int a , int b )”と書いてやりましたが、mainからアクセス出来ません。 そこで、” static void disp(int a , int b )” という風に” static ” を先頭につけてやりましたら、うまく動きました。 これは、mainメソッドから他のメソッドにアクセスする場合には、必ず” static ” をつけてやる必要があるということでしょうか。 ======================================================= class クラス練習 { public static void main(String[] args) { disp(5,10); } /*static*/ void disp(int a , int b ) { System.out.println("a+b = " + (a+b)); } }

    • ベストアンサー
    • Java
  • SwingとEDT(イベントディスパッチスレッド)

    多くのサイトを見て、色々考えているのですが、イマイチ理解が及びません。以下のような風に思っていていいのでしょうか。 ・Swingではメインとなるmainスレッド(表現は正しくないかもしれない)と、描画関係のイベントを実行するイベントディスパッチスレッドで出来てる。 ・描画関係のイベント(正確にはコンポーネントの可視化及び可視化したコンポーネントの描画)はイベントディスパッチスレッド上で実行しなければならない。 ・SwingUtilities.invokeLaterを使うことによってその中身のプログラムをイベントディスパッチスレッドで実行してくれる...? →setVisible(true)やsetText("")など全てSwingUtilities.invokeLaterを使って記述しなければならない.....???(面倒すぎじゃないでしょうか) ・Swingでのマルチスレッドを行うにはSwingWorkerを使う(ことは見つけているのですが、まずEDTについて理解しないと先に進めないと思い、まだあまりこれの内容は調べていません) ・描画系の命令を実行しないのならば、別スレッドを作成して使用しても良い....? こんなところでしょうか。 しかし、このとおりだとすると今までの自分の書いてきたプログラムは間違いだらけ(特に「全ての描画系命令をSwingUtilities.invokeLaterを使いEDTで実行する」点)になってしまいます。 ちゃんとした理解をしておきたいので、わかりやすい説明でも、上記の間違っている点でもご教示願います。

  • 親クラスから子クラスへアクセス。

    親クラスから子クラスへアクセス。 お世話になります。 以下のプログラムについて考えています。 public class Main{  public static void main(String[] args) {   SubA subA = new SubA();   SubB subB = new SubB();   Super[] subs = {subA,subB};   subs[1].method();   subs[2].method();  } } class Super{  String str = "親";  public void method(){   System.out.println(str);  } } class SubA extends Super{  String str = "子A"; } class SubB extends Super{  String str = "子B"; } この場合、出力結果は当然 親 親 になります。 これを子クラスの str を表示するようにしたいのです。つまり 子A 子B です。 ただし、子クラスで method() をオーバーライドしたり、super.str = "子A" のように親クラスを書きかえずにです。 子クラスが何百種類もある場合、全く同じmethod()を書く無駄や、変更があったときにそれを全てを修正しなければならないことを避けたいのです。 何か良案がありましたら、ぜひご教授ください。よろしくお願いします。

  • javaアプレットについて質問です

    本の通りにソースを記入し、コンパイラしました。 その後実行したら Exception in thread"main"java.lang.NoSuchMethodError:main とコマンドプロンプトに表示されました。 何が原因ですか? 因みに下記がソースコードです import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Sample13 extends JApplet { private JLabel lb; private JTextField tf; public void init() { //コンポーネントの作成 lb = new JLabel("お選びください。"); tf = new JTextField(); //コンテナへ追加 add(lb, BorderLayout.NORTH); add(tf, BorderLayout.SOUTH); //リスナの登録 tf.addActionListener(new SampleActionListener()); } //リスナクラス class SampleActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { JTextField tmp = (JTextField) e.getSource(); lb.setText(tmp.getText() + "ですね。"); } } }

  • インスタンス変数へのアクセスについて

    理論的な質問ですが・・ public class pra extends JFrame{ JLabel myj; public pra(){ ~初期化 } public static void main(String args[]){ pra p=new pra(); p.myj.setText("ready"); *1 p.jlset(); } private void jlset(){ myj.setText("go"); *2 } } *1では変数myjにアクセスするのに、オブジェクト参照 変数p が必要ですが、*2では、必要ありません。 この違いがよくわかりません。理屈では*2でもpを つけるべきだと思いますが(p.myj)、これをつけると エラーになってしまいます。 なにかアドバイスお願いします。

    • ベストアンサー
    • Java