- - PR -
JPopupMenuが枠しか表示されない
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-07-07 23:44
Kissingerさん、サンプルコードありがとうございます。
実行してみました。きちんと動作しました。 サンプルコードをいただいて必要な部分がわかった、ような気がするだけかも知れませんが 全体の流れを書いてみます。 import 各種 public class training_11{ static JFrame frame; public JSplitPane mainsplit,mainsplit2; public JPanel panel,panel2; public JList list; public JPopupMenu popup; public JOptionPane optionpane; DefaultListModel listModel; ・・その他変数の宣言 public JMenuBar createMenuBar(){ JMenuBar menubar=new JMenuBar(); ・・メニューバー関連 public Container createContetPane(){ ・・リストになるデーター読み込み list=new JList(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setSelectedIndex(0); JScrollPane listScrollPane=new JScrollPane(); listScrollPane.getViewport().setView(list); list.addMouseListener(new MouseAdapter(){ public void mouseReleased(MouseEvent ev){ if(ev.isPopupTrigger()){ popup.show(ev.getComponent(),ev.getX(),ev.getY());} } }); list.addListSelectionListener(new ListSelectionListener(){ public void valueChanged(ListSelectionEvent ev){ ・・イベント処理 }); ・・panelのデーター読み込み panel=new ChipPane(); panel.setBackground(Color.white); JScrollPane panelScroll=new JScrollPane(panel); panel.setPreferredSize(new Dimension(w*32,h*32)); panel.revalidate(); panel.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent ev) ・・イベント処理 }); ・・panel2データー読み込み panel2=new MapPane(); panel2.setBackground(Color.white); JScrollPane panel2Scroll=new JScrollPane(panel2); panel2.setPreferredSize(new Dimension(w2*32,h2*32)); panel2.revalidate(); panel2.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent ev){ ・・イベント処理 }); mainsplit=new JSplitPanel(JSplitPane.VERTICAL_SPLIT,panelScroll,listScrollPane); mainsplit.setOneTouchExpandable(true); mainsplit.setDividerSize(2); mainsplit.setDividerLocation(300); mainsplit2=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,mainsplit,panel2Scroll); mainsplit2.setOneTouchExpandable(true); mainsplit2.setDividerSize(2); mainsplit2.setDividerLocation(290); panelScroll.setMinimumSize(new Dimension(256,290)); listScrollPane.setMinimumSize(new Dimension(256,100)); panel2Scroll.setMinimumSize(new Dimension(465,400)); mainsplit2.setPreferredSize(new Dimension(745,440)); return mainsplit2; } public class ChipPane extends JPanel{ protected void paintComponent(Graphics gra){ super.paintComponent(gra); Graphics2D gra2D=(Graphics2D)gra; Dimension d=getSize(); gra2D.clearRect(0,0,d.width,d.height); ・・イメージ描画 } } public class MapPane extends JPanel{ protected void paintComponent(Graphics gra2){ super.paintComponent(gra2); ・・イメージの描画 } } public void createPopupMenu(){ //create the popup menu 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); } public JSplitPane getSplitPane(){ return mainsplit2; } public static void main(String args[]){ javax.swing.SwingUtilities.invokeLater(new Runnable(){ public void run(){ createAndShowGUI(); } }); } public static void createAndShowGUI(){ //create and set up the window frame=new JFrame("Training"); if(title==null){ frame.setTitle("Trainig");} else { frame.setTitle(title+"-Training");} frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Look & Feel JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); try{ UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel} catch(Exception ev){System.out.println(ev);} SwingUtilities.updateComponentTreeUI(frame); //create and set up the content pane training_11 training=new tarining(); frame.setJMenuBar(training.createMenuBar()); frame.setContentPane(training.createContetPane()); training.createPopupMenu(); frame.pack(); frame.setVisible(true); } } AWTのコンポーネントは使っていないつもり・・です。不安ですが・・・ | ||||||||
|
投稿日時: 2005-07-08 02:35
ゆうぎりさんのコード、JFrameからはみ出したポップアップメニューがちゃんと表示されましたよ。
Win98, J2SDK 1.5.0_01 | ||||||||
|
投稿日時: 2005-07-09 01:43
Kissingerさん、試していただいてありがとうございます。
このコードでちゃんと表示されるんですね。 最後にポップアップメニューのコードを書いたので、今度はkissingerさんに書いていただいた サンプルコードを元に他の部分を組み込んで、何を組み込んだところで表示がおかしくなるのか 確認したいと思います。 少し時間がかかりそうですが、わかり次第投稿します。 | ||||||||
|
投稿日時: 2005-07-09 07:08
unibon です。こんにちわ。
http://www.google.co.jp/search?num=50&hl=ja&safe=off&c2coff=1&q=Windows+%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2+%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%A9%E3%83%AC%E3%83%BC%E3%82%BF&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja の中のたとえば http://www-6.ibm.com/jp/domino04/pc/support/Sylphd06.nsf/jtechinfo/SYJB-0261448 みたいな感じです。
普通の環境だと、マウスポインタ(自身の描画)は、ハードウェアの機能(ハードウェアアクセラレータ)を使って独立した表示をしているため、マウスポインタがウィンドウやポップアップの描画に影響を及ぼすことはありません。ビデオまわりの設定になにか問題があるのかもしれません。 | ||||||||
|
投稿日時: 2005-07-09 18:18
unibonさん、ありがとうございます。
ハードウェアアクセラレータの目盛をひとつずつずらしてみましたが、 JFrameからはみでると、枠だけになりました。 ビデオまわりの設定というのは、DVDやデジカメデーターの編集などに関わるものでしょうか? 他のPCで動かしても同じでした。 ただ同じ環境のPCしかないので、試したことになるでしょうか? | ||||||||
|
投稿日時: 2005-07-10 01:35
こんばんは。
JPopupMeneが枠しかでない原因と思われるコードが見つかりました。 2番目のイメージの描画の部分のrepaint()のようです。これを消すとちゃんと表示されます。
repaint()の使い方がおかしんでしょうか? | ||||||||
|
投稿日時: 2005-07-10 05:48
おかしいと思いますが、結果的にポップアップになぜ影響を与えているかは存じません。
repaint()の呼び出し結果として paint() → paintComponent()が呼び出されるのであ って、その中から更に repaint()を行うのは循環します。 実際には repaint()の中から直接 paint()を呼び出すわけではなく、再描画要求をキュ ーに入れ、別途、描画処理を行うため、循環していることが重大な結果をもたらすかど うか、そしてその程度は AWTの実装に依ります。 それ以上詳しいことは、AWTの専門家の解説を期待したいところです。 [ メッセージ編集済み 編集者: Kissinger 編集日時 2005-07-10 05:50 ] | ||||||||
|
投稿日時: 2005-07-10 16:29
Kissingerさん、ありがとうございます。
paintComponent()の中にrepaint()を使うと循環することになる、ということは repaint()を記述しなくても本来イメージが描画されるはずということですよね? 自分のコードをよく見ると1つめのイメージ描画はrepaint()なしで描画されていました。 2つめのは描画されないんです。それでrepaint()を記述して、ポップアップが枠だけになったようです。 2つめの描画のコードを1つめのコードと同じにしても2つめは描画されません。 そしてまたパネルにマウスポインタが入ると描画されます。 今度は先に描画の部分を組み込んで確認してみようと思います。 |