- ベストアンサー
ActionListenerについて
- Swingを用いて、メインのフレーム内にカレンダーを作成し、特定の日にメモを入力するためのフレームを作成したい。
- CalendarクラスとMemoクラスを作成し、それぞれ別のフレームとして扱う。
- ActionEventを受け取った場合に、メモ入力用のフレームを作成するメソッドをMainクラスに実装したい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>この場合、ActionEventを登録するのは CalendarFrame クラス。 >それを受け取るのが、Day クラスということでしょうか? んー、正しくいいますと、 CalendarFrameクラスのコンストラクタで、新しく作ったボタンに、ActionListenerとして、関連するDayオブジェクトを登録する。 ですかねぇ。 これの利点は、30個のボタンがそれぞれ関連する別のDayオブジェクトのactionPerformed()を呼び出すので、処理の振り分けが必要ないということです。 >こうした場合、CalendarFrame クラスに >public void actionPerformed(ActionEvent e) {} >を書かざるを得なくなってしまいました。 これがよくわからないのですが、ボタンが押されたときに、MemoFrameを表示する以外にCalendarFrameクラスで何かすることがあると言うことですか? その場合、特にDayオブジェクトと関連性のない場合では、CalendarFrameクラスもActionListenerとして、ボタンに登録してしまえば、いいんじゃないでしょうか。 ↓ Calendar cal = Calendar.getInstance(); for (cal.set(2005, 0, 1); cal.get(Calendar.MONTTH) == 0; cal.roll(Calendar.DATE)) { Day day = new Day(cal.getTimeInMillis(), this); dayList.add(day); JButton button = new JButton(new String(cal.get(Calendar.DATE))); button.addActionListener(day); button.addActionListener(this);←ここを追加した。 ボタンを配置するコードなど。 } 上記とは違い、Dayオブジェクトと関連性のある処理の場合は、せっかく、振り分けを省略したのですから、DayオブジェクトのactionPerformed()から、CalendarFrameのメソッドを呼び出した方がいいと思います。 CalendarFrameにその処理用のメソッドを作っておく public void hoge(Day day) {←引数としてDayオブジェクトを渡せるようにしておく。 ・・・ } DayクラスのactionPerformed()から呼び出す。 public void actionPerformed(ActionEvent e) { owner.hoge(this);←ここを追加 MemoFrame frame = new MemoFrame(this); frame.setMemo(memo); JDesktopPane desktop = owner.getDesktopPane(); desktop.add(frame); frame.setVisible(true); try { frame.setSelected(true); } catch (java.beans.PropertyVetoException e) {} }
その他の回答 (3)
- PecoPlus
- ベストアンサー率76% (144/188)
>コンパイルできない!?なぜ? >私の日頃の行いが悪いから? どうせ、そこらじゅうタイプミスしていると思いますし、見た目をよくするために全角スペースも使っているので、コピペしないで、自分でタイプしていってください。 無責任にも、コンパイルさえしていないので、間違いだらけのはずです。 修行だと思って、なおしなおしやってください。 申し訳ない。 >シンボルを解決できません。 >クラス ActinListener >public class Day implements ActionListener{ > ^ >シンボルを解決できません。 >Day の クラス >public void actionPerformed(Action Event e){ Dayクラスの所にimport文を追加してください。 import java.awt.event.*; ↑ これ
お礼
度々の回答、ありがとうございました。 おかげさまで、今回の疑問を解決することができました。 ただただ、感謝。あるのみです!
補足
大丈夫! コピペはしてないので、こっちのミスです。 >import java.awt.event.*; import java.awt.*; になってました。ご指摘アリガトウございました。 なんとか、コンパイル通りました。
- PecoPlus
- ベストアンサー率76% (144/188)
すいません。for文の所は間違ってますね。 for (cal.set(2005, 0, 1); cal.get(Calendar.MONTH) == 0; cal.add(Calendar.DATE, 1)) { } こっちが正しいです。 他にもいろいろ間違っていると思いますが、なおしなおし見てください。 申し訳ないです。
補足
回答ありがとうございます。 回答No.1より抜粋。 >CalendarFrameクラスでActionEventを受け取らない方がいいんじゃないですかねぇ。 >あと、CalendarFrameクラスのコンストラクタでボタンを作るときに対応するDayオブジェクトも作っていき、addActionListenerで登録していけば、すっきりするんじゃないですか。 この場合、ActionEventを登録するのは CalendarFrame クラス。 それを受け取るのが、Day クラスということでしょうか? こうした場合、CalendarFrame クラスに public void actionPerformed(ActionEvent e) {} を書かざるを得なくなってしまいました。 他のクラスで登録した ActionEvent をまた別のクラスで 受け取る事ができるのでしょうか? 教えてください!!お願いします!おらに力をわけてくれぇ~!
- PecoPlus
- ベストアンサー率76% (144/188)
※java.util.Calendarとごっちゃになるので、クラスの名前をCalendarFrameに変えてます。 CalendarFrameクラスでActionEventを受け取らない方がいいんじゃないですかねぇ。 CalendarFrameクラスで受け取ってしまうと、30個ちかいボタンのうち、どのボタンがイベントを起こしたのか判定しないといけないし、そのボタンがどの日付と関連づけられているかも判定しなくてはいけないので、ちょっと、面倒くさいような気がします。 対策としては、たとえば、下記のようなクラスを作って、 public class Day extends Date implements ActionListener { public String memo; private CalendarFrame owner; public Day(long date, String memo, CalendarFrame owner) { super(date); this.memo = memo; this.owner = owner; } public Day(long date, CalendarFrame owner) { this(date, "", owner); } public void actionPerformed(ActionEvent e) { //Dayオブジェクト関連づけられるようにMemoクラスのコンストラクタを作っておく MemoFrame frame = new MemoFrame(this); //MemoFrameクラスに編集用のJTextAreaに文字をセットするメソッドを作っておく。 frame.setMemo(memo); JDesktopPane desktop = owner.getDesktopPane(); desktop.add(frame); frame.setVisible(true); try { frame.setSelected(true); } catch (java.beans.PropertyVetoException e) {} } } あと、CalendarFrameクラスのコンストラクタでボタンを作るときに対応するDayオブジェクトも作っていき、addActionListenerで登録していけば、すっきりするんじゃないですか。 Calendar cal = Calendar.getInstance(); for (cal.set(2005, 0, 1); cal.get(Calendar.MONTTH) == 0; cal.roll(Calendar.DATE)) { Day day = new Day(cal.getTimeInMillis(), this); dayList.add(day); ↑ArrayListか何かに保持しておく。 JButton button = new JButton(new String(cal.get(Calendar.DATE))); button.addActionListener(day); ボタンを配置するコードなど。 } カレンダーの日付に関する情報とメソッドはDayクラスに集積した方が、すっきりすると思います。 適当に考えたんで、間違えだらけかもしれません。 それに、もっとスマートなやり方があると思いますが、まあ、ちょっとした参考になればいいのですが。 がんばってください。
補足
勘違いしていたようです。 いや、むしろ、知らなかっただけ…。 ゴメンナサイ。無知って恐ろしいです。 なにぶん初心者なものです。 あるクラスで受け取ったActionEventは そのクラスで定義したactionPerformed()を 呼び出す。のみだと思っていました。 と、いうことで、早速試してみようと… コンパイルして… ん? もう一度… ?? コンパイルできない!?なぜ? 私の日頃の行いが悪いから? シンボルを解決できません。 クラス ActinListener public class Day implements ActionListener{ ^ シンボルを解決できません。 Day の クラス public void actionPerformed(Action Event e){ ^ とコンパイルエラーが…。