ActionListenerについて
- Swingを用いて、メインのフレーム内にカレンダーを作成し、特定の日にメモを入力するためのフレームを作成したい。
- CalendarクラスとMemoクラスを作成し、それぞれ別のフレームとして扱う。
- ActionEventを受け取った場合に、メモ入力用のフレームを作成するメソッドをMainクラスに実装したい。
- ベストアンサー
ActionListener について
Swingを用いて、メインのフレーム内に カレンダー(それぞれの日にちをボタンで)を作り、 ある日のボタンが押されると、メモを入力するための フレームを新たに作成。(それぞれ別のクラス) 見たいな事をしたいのです。 カレンダーは public class Calendar extends JInternalFrame implements ActionListener{.....} メモは public class Memo extends JInternalFrame implements ActionListener{....} メインは public class Main extends JFrame{ JDesktopPane main; Calendar cal; Memo memo; .... } てなぐわいに。 で、Cal で ActionEvent を受け取ったら メモ入力用のフレーム memo を main に作成するメソッドを class Main に作りたい。のです。 どうしたらよいでしょうか? 言いたい事が、伝わったでしょうか? 『断固このやり方は、オススメできん!!』 『他の方法があるよ~。』 などあれば、それも教えて頂けると光栄です。 どんなことでも構いませんので、 この無知野郎に『知』をド・ド・ドンッ!!と与えてください。 頭ん中スカッスカですもの。スッカス…カ…ですもの…。
- goose_x_viper
- お礼率49% (31/63)
- Java
- 回答数4
- ありがとう数1
- みんなの回答 (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クラスに集積した方が、すっきりすると思います。 適当に考えたんで、間違えだらけかもしれません。 それに、もっとスマートなやり方があると思いますが、まあ、ちょっとした参考になればいいのですが。 がんばってください。
関連するQ&A
- イベントの宣言について
public class J_applet extends Applet implements ActionListener ,ItemListener { と宣言したところ、 J_applet は abstract でなく、java.awt.event.ActionListener 内の abstract メソッド actionPerformed(java.awt.event.ActionEvent) をオーバーライ ドしません。 とエラーがでました。 インポート宣言はきちんとしました。 上記のような書き方はもしかして出来ないんでしょうか?
- ベストアンサー
- Java
- 内部クラスからはrepaint()は実行できない?
アプレットを勉強している初心者です。 思うような実行が出来ず public class applet extends Applet{ public void init(){} public void paint(){} class buhin extends Button implements ActionListener{ public buhin(){} public void actionPerformed(ActionEvent e){ repaint();//←これ } } } 大雑把ですがこのような構造で、上の場所からはrepaint()は実行できないのでしょうか?動作からはどうやら出来てないようなのですが、いまいち勘なので・・・。 よろしくお願いします。
- ベストアンサー
- Java
- フォルダ選択させる方法
Web上のアプレットをユーザがIEで表示させて、アプレットのボタンを押すとフォルダ選択の ダイアログが出るものを作っています。 ダイアログはJFileChooserのものしか知らないのですが他によいものがありましたら教えてください。 JFileChooserでダイアログを出そうとしていますが、 public class AppletMain extends Applet implements ActionListener{ JFileChooser filechooser = new JFileChooser(""); これでjava.lang.ClassNotFoundException: javax.swing.JFileChooserのエラーが出ます。 JFileChooserの動作確認で public class AppletTest extends JFrame implements ActionListener{ JFileChooser filechooser = new JFileChooser(""); だとうまくいきます。 public class AppletMain がextends Appletなのが実行時エラーの原因だと思って public class AppletMain extends Applet,JFrame implements ActionListener{ とするとコンパイルエラーでした。こんなことも試さないと分からないほど素人です。 フォルダ選択させる方法を教えてください。
- 締切済み
- Java
- JTextAreaを持ったJInternalFrameを作りたい
swingでメモ帳を作っているのですが、 新規作成が押されるごとに新しい JTextAreaを持ったJInternalFrameを作りたいのです。 他にもコピーやJpopupメニューなども機能として 追加しているのですがそれらの機能も新しく作った JInternalFrameで機能するようにしたいんです。 参考になるサイトなど見たりしたんですが 自力では無理でした。。どなたかお願いします☆ public class NotePad extends JFrame{ JDesktopPane desktop = new JDesktopPane(); static JTextArea editArea = new JTextArea(); static NotePad frame = new NotePad(); public static void main(String[] args){ frame.setTitle("メモ帳"); frame.setSize(500,400); frame.setVisible(true); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); } public NotePad(){ JScrollPane sp = new JScrollPane(editArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); NewAction newAction = new NewAction(); JMenuBar mb = new JMenuBar(); JMenu mn1 = new JMenu("ファイル"); mn1.add(newAction); mb.add(mn1); setJMenuBar(mb); getContentPane().add(sp, BorderLayout.CENTER); } class NewAction extends AbstractAction{ NewAction(){ putValue(NAME, "新規ファイル作成"); public void actionPerformed(ActionEvent e){ JInternalFrame inframe = new JInternalFrame( true, true, true, true); JTextArea ta = new JTextArea(""); JScrollPane sp2 = new JScrollPane(ta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); inframe.getContentPane().add(spane) desktop.add(inframe); inframe.setVisible(true); }
- ベストアンサー
- Java
- actionListenerについて
ど素人です 改行の関係でimportは省略してます labelにActionListenerが登録できないのですが、なぜでしょうか class test extends JFrame{ test() { getContentPane().setLayout(new FlowLayout()); JLabel label = new JLabel("てすと"); JButton b1 = new JButton("OK"); b1.addActionListener(label); getContentPane().add(b1); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("JButtonTest"); setSize(200, 100); setVisible(true); } public static void main(String[] args) { new test(); } } class LetLabel extends JLabel implements ActionListener{ public void LetLabe(){ } public void actionPerformed(ActionEvent ae){ } }
- ベストアンサー
- Java
- JPanelからJFrameへの変数にアクセス
JFrameは2つのJPanelを持つ場合JPanelでボタンが押された場合もう1つのJPanelへ影響を及ぼす場合どうしたらいいですか? class FrameTest extends JFrame { PanelTest1 pt1 = new PanelTest1(); PanelTest2 pt2 = new PanelTest2(); pt1.setBoudns(...); pt2.setBoudns(...); add(pt1); add(pt2); } class PanelTest1 extends JPanel implements ActionListener { JButton btn = new JButton("Panel2のaを変える"); //ソース省略します。 //この辺りでbtnをsetBoundsしてpanelに乗せてaction... public void actionPerformed(ActionEvent e) { //★質問はどうやってここでPanelTest2の変数を変えるか? } } class PanelTest2 extends JPanel { public int a; }
- ベストアンサー
- Java
- エラーがでてしまいます・・
Cpadで下記のプログラムを作っているのですが ry21.java:7: Try21 は abstract として宣言する必要があります。actionPerformed(java.awt.event.ActionEvent) を Try21 で定義しません。public class Try21 extends Frame implements ActionListener{ とエラーがでてしまいます。どなたがわかるかたいらっしゃいましたら、教えていただけないでしょうか? 。
- 締切済み
- Java
- ボタンの複数割り当てについて
public class TestButton extends Applet implements ActionListener { Button bt1,bt2,bt3; public void init() { bt1 = new Button("red"); add(bt1); bt2 = new Button("blue"); add(bt2); bt3 = new Button("yellow"); add(bt3); bt1.addActionListener(this); } java初心者です。アプレットで上のようにボタンを作ります。それぞれが押された時に、red,blue,yellowが表示されるようにしたいのです。ActionListenerをインプリメントしているので、 public void actionPerformed(ActionEvent ae) をオーバーライドする必要がありますが、そこで質問です。 ボタンを3種類別々に関連づけるには、actionPerformed内をどのように記述したらよいでしょうか?また、init内はこれだけでいいんでしょうか? よろしくお願いします。
- ベストアンサー
- Java
- ActionListener について
JFrame の上に JPanel があり、JPanel の上に JButton があるとします。 JButton が押されたことを JFrame に知らせるにはどうしたらいいでしょうか。 わかるところまで書いてみました。 class MyFrame extends JFrame implements ActionListener { MyPanel myPanel = new MyPanel(); MyFrame() { myPanel.addActionListener(this); add(myPanel); } public void actionPerformed(ActionEvent e) { System.out.println("The button on the MyPanel was pressed!"); } public static void main(String[] args) { new MyFrame(); } } class MyPanel extends JPanel implements ActionListener { JButton button1 = new JButton(); MyPanel() { button1.addActionListener(this); add(button1); } public void actionPerformed(ActionEvent e) { } }
- ベストアンサー
- Java
- フレームを消したい
こんにちは。 いつもお世話になっております。 また、どうしてもわからないことが出てきてしまいました。 質問よろしいでしょうか? 以下のプログラムを実行して 「次へ」と書かれたボタンをクリックし 次に現れるフレーム上の「このフレームだけ消す」 と書かれたボタンをクリックしたときに 「f2」(2つ目のフレーム)だけ閉じるようにしたいのです。 以下の場合は両方とも閉じてしまうのです。 何かよい方法ご存知ありませんか? よろしくお願いいたします。 ================================================== import java.awt.*; import javax.swing.*; import java.awt.event.*; class unload { public static void main(String[] args) { JFrame f=new JFrame("kiki"); Origin p=new Origin(); Container ct=f.getContentPane(); ct.add(p); f.pack(); f.setVisible(true); } } class Origin extends JPanel implements ActionListener { JButton b; Origin() { b=new JButton("次へ"); this.add(b); b.addActionListener(this); } public void actionPerformed(ActionEvent e) { if (e.getSource()==b) { JFrame f2=new JFrame(); Origin2 p2=new Origin2(); Container ct=f2.getContentPane(); ct.add(p2); f2.pack(); f2.setVisible(true); } } } class Origin2 extends JPanel implements ActionListener { JButton b2; Origin2() { b2=new JButton("このフレームだけ消す"); this.add(b2); b2.addActionListener(this); } public void actionPerformed(ActionEvent e) { if(e.getSource()==b2) { System.exit(0); } } }
- ベストアンサー
- Java
補足
勘違いしていたようです。 いや、むしろ、知らなかっただけ…。 ゴメンナサイ。無知って恐ろしいです。 なにぶん初心者なものです。 あるクラスで受け取ったActionEventは そのクラスで定義したactionPerformed()を 呼び出す。のみだと思っていました。 と、いうことで、早速試してみようと… コンパイルして… ん? もう一度… ?? コンパイルできない!?なぜ? 私の日頃の行いが悪いから? シンボルを解決できません。 クラス ActinListener public class Day implements ActionListener{ ^ シンボルを解決できません。 Day の クラス public void actionPerformed(Action Event e){ ^ とコンパイルエラーが…。