5

JPopupMenu で複製したい右クリック コンテキスト メニューのプロパティがいくつかあります。

  1. メニューが開いているときに他の場所をクリックすると、メニューが閉じます。
  2. メニューが開いているときに他の場所をクリックしても、他に何も起こりません。

私は最初の部分をうまくダウンさせました。しかし、他の場所をクリックすると、他のイベントが発生する可能性があります。たとえば、あるアクション B を実行するボタン A があるとします。現在、JPopupMenu が開いているときに A をクリックすると、JPopupMenu が閉じて B が実行されます。JPopupMenu を閉じて B NOT を実行することをお勧めします。これは可能ですか?

ありがとう

4

2 に答える 2

11

これは機能し、はるかに単純です...ただし、ルックアンドフィールによってオーバーライドされる可能性があります。

UIManager.put("PopupMenu.consumeEventOnClose", Boolean.TRUE);

また、これは MOUSE_PRESSED イベントのみを消費し、後続の MOUSE_CLICKED イベントは消費されないことにも注意してください。mousePressed() でフラグを設定し、mouseReleased() でテストすることで、マウスのクリックをエミュレートできます。最初に押されたマウスが消費された場合、フラグは mouseReleased() に設定されません

private boolean pressed = false;

@Override
public void mousePressed(MouseEvent e) {
    pressed = true;
}

@Override
public void mouseReleased(MouseEvent e) {
    if (pressed) {
         // do click stuff
    }
    pressed = false;
}
于 2011-09-28T14:34:28.827 に答える
3

あなたの質問やコメントで言われたことを考慮して、私はあなたの問題に次のいずれかの方法でアプローチします。

技術的には、ここには2つのオプションがあります。

1.ユーザーがポップアップの外にマウスを移動するたびにポップアップを非表示にします。この方法では、ポップアップが自動的に消えるので、ユーザーがクリックする問題はありません。

2.この特定のマウスイベントをグローバルにキャプチャし、ポップアップが表示されている場合は左クリックでイベントを消費します。この特定のソリューションを以下の例で示します。

    import java.awt.AWTEvent;
    import java.awt.Toolkit;
    import java.awt.event.AWTEventListener;
    import java.awt.event.ActionEvent;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.AbstractAction;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JMenu;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.SwingUtilities;

    public class DisableClickWhenPopupVisibleTest
    {
        public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                @Override
                public void run()
                {               
                    final JPopupMenu popup = new JPopupMenu();
                    popup.add(new JMenu("aAaa"));
                    JPanel contentPane = new JPanel();
                    contentPane.add(popup);
                    JButton b = new JButton();
                    b.setAction(new AbstractAction("Button")
                    {
                        private static final long serialVersionUID = 1L;
                        @Override
                        public void actionPerformed(ActionEvent e)
                        {
                            System.out.println("b actionPerformed");
                        }
                    });
                    contentPane.add(b);
                    contentPane.addMouseListener(new MouseAdapter() {
                        @Override
                        public void mousePressed(MouseEvent e)
                        {
                            showPopup(e);
                        }
                        @Override
                        public void mouseReleased(MouseEvent e)
                        {
                            showPopup(e);
                        }
                        private void showPopup(MouseEvent e)
                        {
                            if(e.isPopupTrigger())
                                popup.show(e.getComponent(), e.getX(), e.getY());
                        }
                    });
                    //use global mouse event capture to disable left click on anything when popup is visible
                    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
                        @Override
                        public void eventDispatched(AWTEvent event)
                        {
                            MouseEvent me = (MouseEvent)event;
                            if(me.getID() == MouseEvent.MOUSE_PRESSED)
                            {
                                System.out.println("eventDispatched popup.vis="+popup.isVisible());
                                if( me.getButton() == MouseEvent.BUTTON3)
                                {   
                                    System.out.println("BUTTON3");
                                }   
                                else if(me.getButton() == MouseEvent.BUTTON1)
                                {
                                    System.out.println("BUTTON1");
                                    if(popup.isVisible())
                                        me.consume();
                                }
                            }
                        }
                    }, AWTEvent.MOUSE_EVENT_MASK);                      
                    JFrame f = new JFrame();
                    f.setContentPane(contentPane);
                    f.setSize(400, 300);
                    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    f.setVisible(true);
                }
            });
        }
    }

ボタンの左側を少し右クリックすると、ポップアップが表示されます。次に、ボタンをクリックしても、そのアクションは呼び出されません。ポップアップが非表示の場合、アクションは通常どおり呼び出されます。この機能は、次のコード行によって提供されますToolkit.getDefaultToolkit().addAWTEventListener(...)。行をコメントアウトして、現在経験しているアクションがどのような場合でも発生することを確認できます。

于 2011-06-07T19:45:08.333 に答える