- - PR -
Swingでメモ帳を作成中なんですが
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-06-21 02:27
@JTextAreaの上で右クリックをしてJPopupMenuを表示させて
コピーや切り取りやペーストの選択肢を作りたいのですが JTextAreaの上で右クリックをすると表示はされるのですが ものすごく大きいパネルで表示され、一度コピーなど表示されると 消えないんですどうしたらよいでしょうか A私の作ったメモ帳のファイルを開くを選択すると 上のフレームのところにそのファイルのパスを表示させたいのですが うまく表示できませんどうしたらどいでしょうか? frame.setTitle(file.getPath());を使えばよいのでしょうか? fileの記述のところでエラーが出るみたいなんですが どなたかお願いします!! ーーーーーーーーーーーーーーー public class NotePad extends JFrame{ //コンポーネントとして static JTextArea editArea = new JTextArea(); //"."でフォルダの指定ができる static JFileChooser fc = new JFileChooser("."); //現在読み込んでいるファイル static File file = null; JPopupMenu popup = new JPopupMenu(); public static void main(String[] args){ //javax.swing.JFrameのsetDefaultLookAndFeelDecorated() JFrame.setDefaultLookAndFeelDecorated(true); //フレームの設定と表示 NotePad frame = new NotePad(); frame.setTitle("メモ帳"); frame.setIconImage(new ImageIcon("image/00810000.gif").getImage()); frame.setSize(500,400); frame.setVisible(true); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setTitle(file.getPath()); } public NotePad(){ //スクロール可能なテキストエリア JScrollPane sp = new JScrollPane(editArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); //アクションの生成 NewAction newAction = new NewAction(); FinAction finAction = new FinAction(); OpenAction openAction = new OpenAction(); OverAction overAction = new OverAction(); SaveAction saveAction = new SaveAction(); SerchAction serchaction = new SerchAction(); CopyAction copyaction = new CopyAction(); CutAction cutaction = new CutAction(); PasteAction pasteaction = new PasteAction(); DeleteAction deleteaction = new DeleteAction(); AllDeleteAction alldeleteaction = new AllDeleteAction(); FirstAction firstaction = new FirstAction(); EndAction endaction = new EndAction(); SelectAction selectaction = new SelectAction(); ProhibitAction prohibitaction = new ProhibitAction(); FreeAction free = new FreeAction(); ColorAction ccaction = new ColorAction(); VersionAction versionaction = new VersionAction(); //メニューの作成 JMenuBar mb = new JMenuBar(); JMenu mn = new JMenu("ファイル"); JMenu mn2 = new JMenu("編集"); JMenu mn3 = new JMenu("表示"); JMenu mn5 = new JMenu("ヘルプ"); //ツールバーの作成 JToolBar tb = new JToolBar(); //ツールバーを固定する tb.setFloatable(false); //メニューに項目を追加 mn.add(newAction); //セパレーターを追加する mn.addSeparator(); mn.add(openAction); mn.add(overAction); mn.add(saveAction); mn.addSeparator(); mn.add(finAction); mn2.add(serchaction); mn2.add(copyaction); mn2.add(cutaction); mn2.add(pasteaction); mn2.addSeparator(); mn2.add(deleteaction); mn2.add(alldeleteaction); mn2.addSeparator(); mn2.add(firstaction); mn2.add(endaction); mn2.addSeparator(); mn2.add(selectaction); mn2.add(prohibitaction); mn2.add(free); mn3.add(ccaction); mn5.add(versionaction); tb.add(openAction); tb.add(overAction); tb.add(copyaction); tb.add(cutaction); tb.add(pasteaction); popup.add(copyaction); popup.add(cutaction); popup.add(pasteaction); //メニューバーにメニューを追加する mb.add(mn); mb.add(mn2); mb.add(mn3); mb.add(mn5); //フレームにメニューバーを設定 setJMenuBar(mb); //ツールバーの追加 getContentPane().add(tb, BorderLayout.NORTH); //テキストエリアの追加 getContentPane().add(sp, BorderLayout.CENTER); getContentPane().add(popup, BorderLayout.CENTER); } class CopyAction extends AbstractAction{ //コピーアクションの設定 CopyAction(){ putValue(NAME, "コピー"); putValue(SMALL_ICON, new ImageIcon("image/scopy.gif")); //キーボードCtrl+Cで切り取りができるようになる //アイコンの上にカーソルを置いたとき文字が出る putValue(SHORT_DESCRIPTION, "新規ファイル作成"); putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke( //javax.swing.KeyStroke KeyEvent.VK_C, ActionEvent.CTRL_MASK) //java.awt.event.KeyEvent ); } public void actionPerformed(ActionEvent e){ //JTextComponentのcopy()を使う editArea.copy(); } } class CutAction extends AbstractAction{ //切り取りアクションの設定 CutAction(){ putValue(NAME, "切り取り"); putValue(SMALL_ICON, new ImageIcon("image/scut.gif")); //キーボードCtrl+Xで切り取りができるようになる。 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke( //javax.swing.KeyStroke KeyEvent.VK_X, ActionEvent.CTRL_MASK) //java.awt.event.KeyEvent ); } public void actionPerformed(ActionEvent e){ editArea.cut(); } } class PasteAction extends AbstractAction{ //貼り付けアクションの設定 PasteAction(){ putValue(NAME, "貼り付け"); putValue(SMALL_ICON, new ImageIcon("image/spaste.gif")); //キーボードCtrl+Vで貼り付けができるようになる。 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke( //javax.swing.KeyStroke KeyEvent.VK_V, ActionEvent.CTRL_MASK) //java.awt.event.KeyEvent ); } public void actionPerformed(ActionEvent e){ editArea.paste(); } } 〜〜〜〜〜〜省略〜〜〜〜〜〜〜 //開くアクション class OpenAction extends AbstractAction{ //開くアクションの設定 OpenAction(){ putValue(NAME, "開く"); putValue(SMALL_ICON, new ImageIcon("image/sopen.gif")); //アイコンの上にカーソルを置いたとき文字が出る putValue(SHORT_DESCRIPTION, "開く"); //キーボードCtrl+Oの操作ができるようになる。 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke( //javax.swing.KeyStroke KeyEvent.VK_O, ActionEvent.CTRL_MASK) //java.awt.event.KeyEvent ); } public void actionPerformed(ActionEvent e){ System.out.println("開くアクション"); //ファイル選択ダイアログの表示 int ret = fc.showOpenDialog(null); //ダイアログ終了状態をチェック if(ret == JFileChooser.APPROVE_OPTION){ //選択されたファイルを取得する File file = fc.getSelectedFile(); //テキストエリアに文章を読み込む try{ FileReader reader = new FileReader(file); editArea.read(reader, new PlainDocument()); }catch(IOException ex){} } } } } | ||||
|
投稿日時: 2005-06-21 09:58
未記入さん、こんにちは。
contentPaneにJPopupMenuのオブジェクトを貼り付けてるからでは ないでしょうか? だいたい BorderLayout.CENTERで同じコンテナに addしたら ポップアップメニューでなくても問題が起きると思います。 私なら、例えばつぎのような感じのマウスリスナを、JTextAreaの オブジェクトに addMouseListenerします。
| ||||
|
投稿日時: 2005-06-21 10:19
どういう「エラー」が出るのか、書きましょうよ。 main() 内で frame.setTitle(file.getPath()); とありますが、このときの file はどういう状態になってるかわかっていますか ? # 個人的には TextArea を static で持つのは好きじゃないですね。 # 別のプログラムからこの NotePad クラスを複数利用したとき、どうなると思います ? | ||||
|
投稿日時: 2005-06-21 13:07
『Kissingerさんへ』
>BorderLayout.CENTERで同じコンテナに addしたら ポップアップメニューでなくても問題が起きると思います。 そうなんです。それは解かってたんですがどうやったら JTextAreaにpopupMenuのイベントに追加できるのか まったくわかりませんでした。 ものすごく勉強になります!! でもコンパイルは通るんですが実行しても反応がないです。 private MouseListene〜〜〜のコードを追加したんですが(泣 『びしばしさんへ』 これもコンパイルは通るんですが実行すると、コマンドプロントに Exception in thread "main" java.lang.NullPointerException at NotePad.main(NotePad.java:54) と表示されます。 >TextArea を static で持つのは好きじゃないですね 本当にそうですねご指摘ありがとうございます!! | ||||
|
投稿日時: 2005-06-21 14:37
良く知らないけど、J2SE 5.0 ではポップアップの使い方が簡単になったらしい。
http://www5.airnet.ne.jp/sakuraba/java/laboratory/J2SE1.5/GUI/PopupMenu/PopupMenu.html | ||||
|
投稿日時: 2005-06-21 14:37
以前、JTextFieldにポップアップメニューを表示させたことがあるのでよければ参考にしてください。JTextAreaも同様のことができるはずです。
http://www.hcn.zaq.ne.jp/no-ji/reseach/20040724.html ポップアップメニューは、「マウスの右ボタンが放されたとき」に表示させるので、 マウスリスナーを使って実装します。 | ||||
|
投稿日時: 2005-06-21 17:31
@の問題が解決できました!
JTextareaにaddMouseListenerして 解決しました。本当に勉強になります。 >良く知らないけど、J2SE 5.0 ではポップアップの使い方が簡単になったらしい 家の環境ではJ2SE 5.0なんですが 他の場所がちょっとバージョンが違うみたいで J2SE 5.0のメソッドを使うとエラーが出てしまうんです。 でも今までにないウィンドウを常に前面に表示させることのできる メソッドとか便利なのがありますよね。 ところでまた新たな質問なんですが B検索C置換D進むE元に戻る と言った機能も加えたいのですが、どうしたらよいでしょうか? 検索と置換はダイアログボックスを表示させ 色々やってるのですがうまくいきません。 ヒントをお願いします! | ||||
|
投稿日時: 2005-06-21 18:48
どう「色々やってる」のかわかりません。もっと質問内容を絞らないと「どこがわかっていないのか」がわからないのでヒントの出しようがありませんよ。 とりあえず関係ありそうな Java Tutorial を読みましょう。 http://java.sun.com/docs/books/tutorial/uiswing/components/text.html http://java.sun.com/docs/books/tutorial/java/data/searchar.html ところでAは解決していないんですか ? [ メッセージ編集済み 編集者: びしばし 編集日時 2005-06-21 18:50 ] |