- ベストアンサー
アクションイベントを起こしたい
JButtonを設置して、 ボタンを押したときに、 何かする方法はわかります。 例えば、ボタンを押したときではなくて、 ほかの処理と連動させて、 プログラムからアクションイベントを起こすにはどうしたらいいのでしょう? Delphiでしたら、たとえば Buttton1.click; でいいんですが・・・・。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
JButtonは、親クラスのAbstractButtonからdoClickというメソッドを継承しているので、これを使えば何とかなるような気がします。 私は実際にこのメソッドを使ったことはありませんが、Swingなら多分これでいけるのでは? またもう一つ方法がありまして、(最初の回答者も同じようなことをおっしゃっていますが)ボタンイベントとそれとは別の処理で共通している部分をメソッドとして独立させておき、それぞれの処理でそのメソッドを呼び出すということもできます。
その他の回答 (2)
- okure_donchan
- ベストアンサー率54% (25/46)
こんな感じでボタン作りますよね。 JButton jButton = new JButton("button"); jButton.addActionListener(new ButtonListener()); ////////// 中略 ////////// class ButtonListener implements ActionListener{ public void actionPerformed(ActionEvent e) { //何かのイベント } } このときに生成したButtonはインナークラスButtonLister(ActionListerをimplements)をaddしておくことによって、ActionEventを受けることができますよね。 そして、他で発生したActionEventを拾って、 ActionEvent e = //発生したActionEvent; jButton.actionPerformed(e); としたらJButtonが持っているActionを発生できます。
補足
遅くなりました! 回答ありがとうございます。 ボタンを4つ用意して、 他のボタンを押したとき、 連動させたかったのですが、 たとえばbtn1とbtn2で、ご回答にあるように btn1がButtonListenerだとすると Actionevevt のeはその内部で定義されており・・・ 外側から ActionEvent e = //発生したActionEvent; jButton.actionPerformed(e); のようにするとシンボルが解決できません、のおなじみなエラーが出てしまいます。 さらに、btn2を押したあとにその処理後にbtn1を押す、と言うことをプログラムしたかったのですが、 btn2Listenerクラスの内部で、上記のように記述すると、 Actionevent eはすでに定義されています、と言うようなエラーが出てしまいました・・・ う~~ん とうなってしまいました・・・・
- takaP-
- ベストアンサー率79% (83/105)
java.awt.Button ならば Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(new ActionEvent(button,ActionEvent.ACTION_PERFORMED,"Click")); でいけたんですが JButton では駄目みたい。。。 で、アクションイベントを起すという方法ではなくて、actionPerformed() 内の処理を別メソッドとして定義し、 public void actionPerformed(ActionEvent e){ foo(); } private void foo(){ // 何がしかの処理 } と、actionPerformed() から呼び出しをする形にします。 で、他の処理と連動した流れで直接 foo() を呼び出すのも良いのですが、それではスレッドセイフではないので SwingUtilities.invokeLater(new Runnable(){ public void run(){ foo(); } } とすれば良いかと思います。 うーん、しかし Swing の場合のイベント起こしってどうやるんでしょうね??
補足
スレッドセイフの意味がよくわからないのですが、 結局はこの方法を使いました。 ありがとうございました
お礼
ものすごく簡単でした! が・・・1.4以上でないとだめなんですね・・・ 実は今セミナーで学んでいて、 そこで使っているのが1.3なんですよ・・・ 1.3で何とか実現したいのですが・・・