- ベストアンサー
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); }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>Jpopupメニューが追加できません。 >JtextAreaのtaの位置の関係でなかなかどの位置に >おけばよいかわからなくなってしまいました。 JPopupMenuのインスタンス作成をどこでどうやればわからなくなった、ということでしょうか。 いろいろ考え方がありますけど、ウィンドウごとに機能を用意したいのであれば内部フレームのクラス内で、全体で統一したメニューを用意したいのであればNotePadでJPopupMenuのフィールドを用意しておくのが良いでしょう。 ただし、ポップアップメニューを呼び出すためのマウス関係のイベントリスナー組み込みは内部クラスのコンストラクタで行っておかないといけないでしょう。 例えばですが。 ※NotePadクラスの処理 ・以下のフィールドを置く。 JPopupMenu popup; ・コンストラクタで以下の処理を追加する。 popup = new JPopupMenu(); JMenuItem pop1 = new JMenuItem("test"); // メニュー項目の例 popup.add(pop1); popup.add(cutAction); // メニュー項目の例 ・以下のメソッドを置く。 private void popupMenu(MouseEvent event) { if (event.isPopupTrigger()) { popup.show(event.getComponent(), event.getX(), event.getY()); } } ※内部クラス(NoteFrame)内の処理 ・コンストラクタでtaを作成した後、リスナーを登録する。 ta.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent event) { popupMenu(event); } public void mouseReleased(MouseEvent event) { //popupMenu(event); } }); ・・こんな感じで、ポップアップのイベントの組み込みは内部フレーム側に、ポップアップメニューのインスタンスと、実際に呼び出されて実行される処理は外側のフレームクラス側においてはどうでしょうか。ちょっとあちこちに処理が分割してあまりきれいではありませんが・・。 他にもやりかたはいろいろあります。どこに置くのが一番後々便利か、考えて配置しましょう。 P.S. 本題の質問とは既に関係なくなってますから、こういうのは新たに質問を立てたほうがわかりやすいかも。
その他の回答 (2)
- pcbeginner
- ベストアンサー率46% (261/560)
勘違いor的外れだったらごめんなさい。 >swingでメモ帳を作っているのですが、 >新規作成が押されるごとに新しい >JTextAreaを持ったJInternalFrameを作りたいのです。 新規作成が押されると JTextAreaを持ったJInternalFrameを 作りたいのですか??? 今作ってる「メモ帳」の新しいインスタンスを作って表示するんじゃなくて? 感覚的な例ですけど、例えば public class メモ帳{ public メモ帳(){ //コンストラクタ } public void actionPerformed(ActionEvent e){ … //「新規作成」の場合 new メモ帳(); … } public static void main(String[] args){ メモ帳 memo = new メモ帳(); } } のような感じで。 違うのかな? (あまり深いこと考えてないのですが…)
お礼
みなさんありがとうございます。。 Kyon2_PaPaさん何度もありがとうございます!! なんとかできたんですが、 ta.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { popupMenu(event); } public void mouseReleased(MouseEvent event) { popupMenu(event); } }); } private void popupMenu(MouseEvent event) { if (event.isPopupTrigger()) { popup.show(event.getComponent(), event.getX(), event.getY()); } } のJpopupメニューが追加できません。 JtextAreaのtaの位置の関係でなかなかどの位置に おけばよいかわからなくなってしまいました。
とりあえず、細かなところでいろいろ問題があるようですので、主な考え方だけ・・・。 ・まず、全体のウィンドウとなるJFrameを用意します。 ・その中にJDesktopPaneを入れます。 ・内部ウィンドウを作成するときは、このJDesktopPaneにJInternalFrameを入れます。 こういう構造になりますから、NotePadはextends JFrameしたほうが便利でしょう。そして、コンストラクタに、JDesktopPaneとJMenuBarによるメニューなどを組み込む処理をする。ここでは、内部フレームのクラスの作成に関する処理はしません。 内部フレームは、別途クラスとして定義します。ここで、スクロールバーだのテキストエリアだのを組み込む処理をします。 メニューバーにはそれぞれアクションのクラスを設定し、その中で、別途用意した内部フレーム用のクラスを新規に作成したり、現在選択されている内部フレームに対し処理を行うようなことをします。 現在選択されている内部フレームは、JDesktopPaneのgetSelectedFrameで得ることができます。 ざっと以下のような感じですので参考にしてみてください。(import関係は省略) public class NotePad extends JFrame { JDesktopPane desktop; public static void main(String[] args){ NotePad frame = new NotePad(); frame.setTitle("メモ帳"); frame.setSize(500,400); frame.setVisible(true); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); } public NotePad(){ desktop = new JDesktopPane(); NewAction newAction = new NewAction(); JMenuBar mb = new JMenuBar(); JMenu mn1 = new JMenu("ファイル"); mn1.add(newAction); mb.add(mn1); setJMenuBar(mb); CutAction cutAction = new CutAction(); JMenu mn2 = new JMenu("編集"); mn2.add(cutAction); mb.add(mn2); getContentPane().add(desktop,BorderLayout.CENTER); } // 新規作成の処理のクラス class NewAction extends AbstractAction{ NewAction(){ putValue(NAME, "新規ファイル作成"); } public void actionPerformed(ActionEvent e){ NoteFrame inframe = new NoteFrame(); inframe.setSize(300,200); desktop.add(inframe); inframe.setVisible(true); } } // カットの処理のクラス class CutAction extends AbstractAction{ CutAction(){ putValue(NAME, "カット"); } public void actionPerformed(ActionEvent e){ NoteFrame inframe = (NoteFrame)desktop.getSelectedFrame(); JTextArea ta = inframe.getTextArea(); // taを使ってカットの処理 System.out.println("Cut:" + ta.getSelectedText()); } } // これが内部フレームのクラス class NoteFrame extends JInternalFrame{ JTextArea ta; NoteFrame(){ ta = new JTextArea(""); JScrollPane sp = new JScrollPane(ta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); this.getContentPane().add(sp); } JTextArea getTextArea(){ return ta; } } } P.S. とりあえず、全角文字で書いてあるといったケアレスミスは取り除いた形でコードを掲載しましょう。
お礼
Kyon2_PaPaさんありがとうございます☆ 本当に助かりました!! >本題の質問とは既に関係なくなってますから、こういうのは新たに質問を立てたほうがわかりやすいかも。 そうですね、 さっ、、早速新たな問題が出てしまいました。 周りの人に聞いても解らないって言われてしまって 自分で解決しなければいけないと思うんですが。 情けない。。できないです