- PR -

JPopupMenuが枠しか表示されない

投稿者投稿内容
ゆうぎり
会議室デビュー日: 2005/07/04
投稿数: 10
投稿日時: 2005-07-05 23:12
はじめまして。ゆうぎりと言います。
Javaをはじめたばかりの初心者です。
よろしくお願いします。

困っていることは、JPopupMenuの一部がJFrameからはみ出す時、薄いグレーの四角が
表示されるだけで、文字が出ないことです。マウスでなぞると文字が出てきます。

JFrameは、JSplitPane2つで、3つに分割しています。
JSplitPaneは、JPanel2つとJList1つです。それぞれにJScrollPaneがあります。

JPopupMenuは、JListのイベントで表示するようにしています。

list.addMouseListener(new MouseAdapter(){
 public void mouseReleased(MouseEvent ev){
  if(ev.isPopupTrigger()){
   popup.show(ev.getComponent(),ev.getX(),ev.getY());
  }
 }
});

上記popupは、
public void createPopupMenu(){
 popup=new JPopupMenu();

 JMenuItem setting=new JMenuItem("設定");
 JMenuItem create=new JMenuItem("作成");
 JMenuItem copy=new JMenuItem("コピー");
 JMenuItem paste=new JMenuItem("貼り付け");
 JMenuItem delete=new JMenuItem("削除");

 popup.add(setting);
 popup.add(new JSeparator());
 popup.add(create);
 popup.add(new JSeparator());
 popup.add(copy);
 popup.add(paste);
 popup.add(delete);
}

表示することに躓いてイベント処理はまだです。
よろしくお願いします。
MARU
常連さん
会議室デビュー日: 2005/02/16
投稿数: 35
投稿日時: 2005-07-06 08:47
JPopupMenu#pack()

上記メソッドをadd処理が終わった後に追記してみてはいかがでしょうか?


※URLが間違っていたので修正しました。

[ メッセージ編集済み 編集者: MARU 編集日時 2005-07-06 08:48 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-07-06 09:10
ゆうぎりさん、こんにちは。

ゆうぎりさんのコードをそのままに足りないところだけを補って
試してみましたが、問題は発生しませんでしたよ。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-07-06 09:48
unibon です。こんにちわ。

引用:

ゆうぎりさんの書き込み (2005-07-05 23:12) より:
困っていることは、JPopupMenuの一部がJFrameからはみ出す時、薄いグレーの四角が
表示されるだけで、文字が出ないことです。マウスでなぞると文字が出てきます。


「マウスでなぞる」とは、マウスポインタ(マウスカーソル)をそこに動かすだけで描画が変わるのでしょうか?(それともマウスでなにか別のウィンドウをドラッグして動かすと、ということでしょうか?)
もしマウスだけでなるとすれば、ビデオドライバー絡みの問題のような気がします。もし Windows だったら、ハードウェアアクセラレータをオフにするなどしてみてはどうでしょうか。また、別のウィンドウが重なった後に重なりがなくなったら描画される、という場合は起動時に
-Dsun.java2d.noddraw=true
を指定すると良いかもしれません。
また、もし可能なら、別の PC でも動かしてみることもお勧めします。

#以下、あとで追加。
再現する完全なソースコードがあると切り分けしやすいかもしれません。また、
menuBarのフロント表示について
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22592&forum=12
のようなことはないでしょうか。

[ メッセージ編集済み 編集者: unibon 編集日時 2005-07-06 09:51 ]
a-san
常連さん
会議室デビュー日: 2004/03/15
投稿数: 30
投稿日時: 2005-07-06 13:42
たしか、JPopupMenu はメニューがウィンドウの内側の時にはLightWeight(OSのウィンドウを使わずに)として、
ウィンドウからはみ出る場合にはHeavyWeight(OSのウィンドウを使って)として作られていたと思います。
はみ出るかどうかによって作られ方が違います。
Swingのバグと思われます。Javaのバージョンはいくらでしょうか?
Javaのバージョンを上げて試してみてください。
あるいは以下のようにして、常にHeavyWeightとして作るようにすればうまくいくかも知れません。
popup.setLightWeightPopupEnabled(false);
ゆうぎり
会議室デビュー日: 2005/07/04
投稿数: 10
投稿日時: 2005-07-07 00:05
ご返答ありがとうございます。

MARUさんに教えていただいた popup.pack();
a-sanさんに教えていただいた popup.setLightWeightPopupEnabled(false);
をしてみましたが、フレームから出る部分があると枠のみの表示になりました。
バージョンは、j2sdk1.4.2_08 です。OSは、Windows.XP Service Pack2 です。

unibonさんの言われるハードウェアアクセラレータをオフにするというのはどうすればいいのでしょうか?
マイコンピューターのヘルプでは見つかりませんでした。操作方法を教えていただけないでしょうか。
描画はマウスポインタを動かすだけで変わります。
別のPCでは、週末にはできるのでやってみたいと思います。
再現できる完全なコードですが、メインとなるファイルが500行くらいで、実行時にmdbファイルから
データーを取り込んでいて、そのデーターをリスト表示しています。
今困っていることにどの部分が必要なのかよくわからないんです。

クラスのファイルを一旦削除してコンパイルしてみると、メインとなるクラスのファイルが10個できたんですが
根本の作りがおかしいということでしょうか?
import のあと
public class training_11{
で始まるのですが、training11$1、 training11$2・・training11$10 までできています。
Trail:Creating a GUI with JFC/Swing: Table of ContentsのHow to...を見て
同じように作ったつもりなのですが。

menuBarのフロント表示について
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22592&forum=12
ですが、J が付けば軽量だと思っていました。
JFrame、JSplitPane、JPanel、JList、JScrollPane、JDialgを使っています。
問題ありでしょうか?



[ メッセージ編集済み 編集者: ゆうぎり 編集日時 2005-07-07 00:12 ]
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-07-07 08:51
恥ずかしながら、私が試したサンプルコードを示します。
DBもアクセスしませんし、クラス名も実行環境もゆうぎりさんのと違いますが。
コード:

import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;

public class Test extends JPanel {

public static void main(String[] args) {
Test test = new Test();
JFrame frame = new JFrame("Test");
frame.getContentPane().add(test);
frame.setBounds(100, 100, 320, 240);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}

private JList list;
private JScrollPane scrollForList;

private JPanel panel1;
private JScrollPane scrollForPanel1;

private JPanel panel2;
private JScrollPane scrollForPanel2;

private JPopupMenu popup;

public Test() {
super(new BorderLayout());

list = new JList(new String[] {
"abcdefg",
"1234567",
"あいうえお",
"ABCDEFG",
"こんにちは",
"Digital Research",
"Sun Microsystems Inc.",
"IBM",
"Oracle",
"BEA"
});
list.addMouseListener(new MouseAdapter(){
public void mouseReleased(MouseEvent ev){
if(ev.isPopupTrigger())
popup.show(ev.getComponent(),
ev.getX(),
ev.getY());
}
});
scrollForList = new JScrollPane(list);

panel1 = new JPanel();
scrollForPanel1 = new JScrollPane(panel1);

panel2 = new JPanel();
scrollForPanel2 = new JScrollPane(panel2);

JSplitPane split2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
scrollForList,
scrollForPanel1);
JSplitPane split1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
split2,
scrollForPanel2);
add(split1);

createPopupMenu();
}

public void createPopupMenu(){
popup = new JPopupMenu();

JMenuItem setting = new JMenuItem("設定");
JMenuItem create = new JMenuItem("作成");
JMenuItem copy = new JMenuItem("コピー");
JMenuItem paste = new JMenuItem("貼り付け");
JMenuItem delete = new JMenuItem("削除");

popup.add(setting);
popup.add(new JSeparator());
popup.add(create);
popup.add(new JSeparator());
popup.add(copy);
popup.add(paste);
popup.add(delete);
}
}



Win98, 2000で試しました。

[ メッセージ編集済み 編集者: Kissinger 編集日時 2005-07-07 08:52 ]
a-san
常連さん
会議室デビュー日: 2004/03/15
投稿数: 30
投稿日時: 2005-07-07 12:41
こちらは、J2SE1.4.2_01、Win2000ですが問題なかったです。
SwingとAWTのコンポーネントを混在させてませんか?

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