- PR -

Swingでメモ帳を作成中なんですが

投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2005/06/03
投稿数: 22
投稿日時: 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){}
}
}
}
}



Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-06-21 09:58
未記入さん、こんにちは。

contentPaneにJPopupMenuのオブジェクトを貼り付けてるからでは
ないでしょうか?
だいたい BorderLayout.CENTERで同じコンテナに addしたら
ポップアップメニューでなくても問題が起きると思います。

私なら、例えばつぎのような感じのマウスリスナを、JTextAreaの
オブジェクトに addMouseListenerします。
コード:
private MouseListener mouseListener = new MouseAdapter() {
	public void mouseReleased(MouseEvent e) {
		if (e.isPopupTrigger()) {
			popupMenu.show((JTextArea)e.getSource(),
				e.getX(), e.getY());
		}
	}
};



びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2005-06-21 10:19
引用:

未記入さんの書き込み (2005-06-21 02:27) より:
A私の作ったメモ帳のファイルを開くを選択すると
上のフレームのところにそのファイルのパスを表示させたいのですが
うまく表示できませんどうしたらどいでしょうか?
frame.setTitle(file.getPath());を使えばよいのでしょうか?
fileの記述のところでエラーが出るみたいなんですが



どういう「エラー」が出るのか、書きましょうよ。

main() 内で frame.setTitle(file.getPath()); とありますが、このときの file はどういう状態になってるかわかっていますか ?

# 個人的には TextArea を static で持つのは好きじゃないですね。
# 別のプログラムからこの NotePad クラスを複数利用したとき、どうなると思います ?
未記入
常連さん
会議室デビュー日: 2005/06/03
投稿数: 22
投稿日時: 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 で持つのは好きじゃないですね

本当にそうですねご指摘ありがとうございます!!

未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-06-21 14:37
良く知らないけど、J2SE 5.0 ではポップアップの使い方が簡単になったらしい。

http://www5.airnet.ne.jp/sakuraba/java/laboratory/J2SE1.5/GUI/PopupMenu/PopupMenu.html
a-san
常連さん
会議室デビュー日: 2004/03/15
投稿数: 30
投稿日時: 2005-06-21 14:37
以前、JTextFieldにポップアップメニューを表示させたことがあるのでよければ参考にしてください。JTextAreaも同様のことができるはずです。
http://www.hcn.zaq.ne.jp/no-ji/reseach/20040724.html
ポップアップメニューは、「マウスの右ボタンが放されたとき」に表示させるので、
マウスリスナーを使って実装します。
未記入
常連さん
会議室デビュー日: 2005/06/03
投稿数: 22
投稿日時: 2005-06-21 17:31
@の問題が解決できました!
JTextareaにaddMouseListenerして
解決しました。本当に勉強になります。

>良く知らないけど、J2SE 5.0 ではポップアップの使い方が簡単になったらしい
家の環境ではJ2SE 5.0なんですが
他の場所がちょっとバージョンが違うみたいで
J2SE 5.0のメソッドを使うとエラーが出てしまうんです。
でも今までにないウィンドウを常に前面に表示させることのできる
メソッドとか便利なのがありますよね。

ところでまた新たな質問なんですが
B検索C置換D進むE元に戻る
と言った機能も加えたいのですが、どうしたらよいでしょうか?

検索と置換はダイアログボックスを表示させ
色々やってるのですがうまくいきません。
ヒントをお願いします!


びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2005-06-21 18:48
引用:

未記入さんの書き込み (2005-06-21 17:31) より:
ところでまた新たな質問なんですが
B検索C置換D進むE元に戻る
と言った機能も加えたいのですが、どうしたらよいでしょうか?

検索と置換はダイアログボックスを表示させ
色々やってるのですがうまくいきません。
ヒントをお願いします!



どう「色々やってる」のかわかりません。もっと質問内容を絞らないと「どこがわかっていないのか」がわからないのでヒントの出しようがありませんよ。

とりあえず関係ありそうな 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 ]

スキルアップ/キャリアアップ(JOB@IT)