2016-04-26 8 views
3

ここには、私が持っているものが含まれています。 (私はそのようにコードを見つけました):JPopupMenuアクションがトリガーされていません

class CustomPopup extends JPopupMenu { 
    public CustomPopup() {} 

    @Override 
    public void setVisible(boolean visible) 
    { 
     // Case 1: 
     //if (visible) super.setVisible(visible); 
     // Case 2: 
     super.setVisible(visible); 
    } 
} 

class CustomPanel extends JPanel { 
    // .../... 
    public CustomPanel() { 
     setSize(200, 200); 
     addMouseListener(new MouseAdapter(){ 
      @Override 
      public void mousePressed(MouseEvent e){ 
       onMousePressed(e); 
      } 
     }); 

    } 

    public void onMousePressed(MouseEvent e) 
    { 
     JPopupMenu pop = new JPopupMenu(); 

     pop.add(new AbstractAction("foo") 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       // do stuff 
       System.out.println("this is executed"); 
      } 
     }); 
     pop.show(e.getComponent(), e.getX(), e.getY()); 
    } 
} 

public class TestPopup extends JFrame { 
    CustomPanel _pp; 
    CustomPopup _cpop; 

    public TestPopup() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(333, 333); 
     _cpop = new CustomPopup(); 
     _pp = new CustomPanel(); 
     _cpop.add(_pp); 

     addMouseListener(new MouseAdapter(){ 
      @Override 
      public void mousePressed(MouseEvent e){ 
       _cpop.show(e.getComponent(), 0, 0); 
      } 
     }); 
    } 
    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       (new TestPopup()).setVisible(true); 
      } 
     }); 
    } 
} 

ポップアップメニューにカスタムパネルが表示されます。それと対話するときには、選択肢のリストを含む古典的なポップアップメニューが表示されます。

私の問題は、​​がそれ自体を閉じるべきではないということです。犯人は明らかにsetVisibleのオーバーライドですが、オーバーライドメソッドを削除したり、条件をコメントアウトしたりすると、別の問題が発生します。popに追加されたactionPerformedメソッドが呼び出されることはありません。私はそれが

  • JPopupMenuを開くには、何かをクリックすると​​が
  • 私は新しいの項目をクリックして表示されたまま
    1. ​​が開きます:最初のケースで

      メニュー

    2. Actionがトリガーされます
    3. 私はそれで何かをクリックしてください

      1. ​​
      2. を開き
      3. JPopupMenuを開き、​​が
      4. を隠されているの項目にIをクリックします。第2のケースで

      新しいメニュー

    4. ActionですOT私の結論は、アクションをトリガーするため​​は、私は本当に理由を理解していない場合でも、見えなければならないということです

    を引き起こしました。だから私の質問は:どのようにをデフォルトのJPopupMenuの動作を破らないように開いたままにするか、または​​でアクショントリガーを正しく表示させるにはどうすればいいですか?

  • +1

    「JComponent :: setComponentPopupMenu()」はなぜですか? – trashgod

    +0

    @trashgodもっと教えていただけますか?どのように問題を解決していますか? – gregseth

    +0

    私はそれがそうであるかどうかわかりません。試してみるとどうなりますか?また、[ポップアップ・メニューは異なるシステムでは異なる方法でトリガされるため、['isPopupTrigger()'](https://docs.oracle.com/javase/tutorial/uiswing/components/menu.html#popup)を確認する必要があることも考慮してください。 " – trashgod

    答えて

    2

    ポップアップの親がアクショントリガーで表示される必要があります(私にとってそうであると思われる音)。だから最後のステップを除いて、すべての人にそれを働かせるようにしました。自分でカスタムポップアップを閉じる。コードは次のとおりです。

    class CustomPopup extends JPopupMenu { 
        public CustomPopup() {} 
    
        @Override 
        public void setVisible(boolean visible) 
        { 
         // Case 1: 
         if (visible) super.setVisible(visible); 
         // Case 2: 
    //  super.setVisible(visible); 
        } 
        public void makeInvisible() { 
         super.setVisible(false); 
        } 
    } 
    
    class CustomPanel extends JPanel { 
        // .../... 
        public CustomPanel() { 
         setSize(200, 200); 
         addMouseListener(new MouseAdapter(){ 
          @Override 
          public void mousePressed(MouseEvent e){ 
           onMousePressed(e); 
          } 
         }); 
    
        } 
    
        public void onMousePressed(MouseEvent e) 
        { 
         JPopupMenu pop = new JPopupMenu(); 
    
         pop.add(new AbstractAction("foo") 
         { 
          @Override 
          public void actionPerformed(ActionEvent e) 
          { 
           // do stuff 
           System.out.println("this is executed"); 
           Component comp = (Component) e.getSource(); 
           if (comp != null && comp.getParent() instanceof JPopupMenu) { 
            JPopupMenu popupMenu = (JPopupMenu) comp.getParent(); 
            if (popupMenu.getInvoker() instanceof CustomPanel) { 
             CustomPopup cpop = (CustomPopup) popupMenu.getInvoker().getParent(); 
             cpop.makeInvisible(); 
            } 
           } 
          } 
         }); 
         pop.show(e.getComponent(), e.getX(), e.getY()); 
        } 
    } 
    
    public class TestPopup extends JFrame { 
        CustomPanel _pp; 
        CustomPopup _cpop; 
    
        public TestPopup() { 
         setDefaultCloseOperation(EXIT_ON_CLOSE); 
         setSize(333, 333); 
         _cpop = new CustomPopup(); 
         _pp = new CustomPanel(); 
         _cpop.add(_pp); 
    
         addMouseListener(new MouseAdapter(){ 
          @Override 
          public void mousePressed(MouseEvent e){ 
           _cpop.show(e.getComponent(), e.getX(), e.getY()); 
          } 
         }); 
        } 
        public static void main(String[] args) { 
         java.awt.EventQueue.invokeLater(new Runnable() { 
          public void run() { 
           (new TestPopup()).setVisible(true); 
          } 
         }); 
        } 
    } 
    
    関連する問題