- PR -

JPopupMenuが枠しか表示されない

投稿者投稿内容
ゆうぎり
会議室デビュー日: 2005/07/04
投稿数: 10
投稿日時: 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のコンポーネントは使っていないつもり・・です。不安ですが・・・
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-07-08 02:35
ゆうぎりさんのコード、JFrameからはみ出したポップアップメニューがちゃんと表示されましたよ。

Win98, J2SDK 1.5.0_01

ゆうぎり
会議室デビュー日: 2005/07/04
投稿数: 10
投稿日時: 2005-07-09 01:43
Kissingerさん、試していただいてありがとうございます。
このコードでちゃんと表示されるんですね。
最後にポップアップメニューのコードを書いたので、今度はkissingerさんに書いていただいた
サンプルコードを元に他の部分を組み込んで、何を組み込んだところで表示がおかしくなるのか
確認したいと思います。
少し時間がかかりそうですが、わかり次第投稿します。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-07-09 07:08
unibon です。こんにちわ。

引用:

ゆうぎりさんの書き込み (2005-07-07 00:05) より:
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-07 00:05) より:
描画はマウスポインタを動かすだけで変わります。


普通の環境だと、マウスポインタ(自身の描画)は、ハードウェアの機能(ハードウェアアクセラレータ)を使って独立した表示をしているため、マウスポインタがウィンドウやポップアップの描画に影響を及ぼすことはありません。ビデオまわりの設定になにか問題があるのかもしれません。
ゆうぎり
会議室デビュー日: 2005/07/04
投稿数: 10
投稿日時: 2005-07-09 18:18
unibonさん、ありがとうございます。
ハードウェアアクセラレータの目盛をひとつずつずらしてみましたが、
JFrameからはみでると、枠だけになりました。
ビデオまわりの設定というのは、DVDやデジカメデーターの編集などに関わるものでしょうか?

他のPCで動かしても同じでした。
ただ同じ環境のPCしかないので、試したことになるでしょうか?
ゆうぎり
会議室デビュー日: 2005/07/04
投稿数: 10
投稿日時: 2005-07-10 01:35
こんばんは。
JPopupMeneが枠しかでない原因と思われるコードが見つかりました。
2番目のイメージの描画の部分のrepaint()のようです。これを消すとちゃんと表示されます。

コード:

public class MapPane extends JPanel{
  protected void paintComponent(Graphics gra2){
    super.paintComponent(gra2);
    Graphics2D gra2D2=(Graphics2D)gra2;

    for(int i=0;i<h2;i++){
      for(int i2=0;i2<w2;i2++){
        int no=chip_no[i2][i];
        int x=(no%w)*32;
        int y=(no/w)*32;
        gra2D2.drawImage(image1,i2*32,i*32,(i2+1)*32,(i+1)*32,x,y,x+32,y+32,this);
        gra2D2.drawRect(i2*32,i*32,32,32);
      }
    }
    repaint();
  }
}


repaint()の使い方がおかしんでしょうか?
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-07-10 05:48
おかしいと思いますが、結果的にポップアップになぜ影響を与えているかは存じません。

repaint()の呼び出し結果として paint() → paintComponent()が呼び出されるのであ
って、その中から更に repaint()を行うのは循環します。

実際には repaint()の中から直接 paint()を呼び出すわけではなく、再描画要求をキュ
ーに入れ、別途、描画処理を行うため、循環していることが重大な結果をもたらすかど
うか、そしてその程度は AWTの実装に依ります。

それ以上詳しいことは、AWTの専門家の解説を期待したいところです。

[ メッセージ編集済み 編集者: Kissinger 編集日時 2005-07-10 05:50 ]
ゆうぎり
会議室デビュー日: 2005/07/04
投稿数: 10
投稿日時: 2005-07-10 16:29
Kissingerさん、ありがとうございます。
paintComponent()の中にrepaint()を使うと循環することになる、ということは
repaint()を記述しなくても本来イメージが描画されるはずということですよね?
自分のコードをよく見ると1つめのイメージ描画はrepaint()なしで描画されていました。
2つめのは描画されないんです。それでrepaint()を記述して、ポップアップが枠だけになったようです。
2つめの描画のコードを1つめのコードと同じにしても2つめは描画されません。
そしてまたパネルにマウスポインタが入ると描画されます。
今度は先に描画の部分を組み込んで確認してみようと思います。

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