Java 为什么';在JDialog中调用的JContextMenu中单击是否触发ActionEvent?

Java 为什么';在JDialog中调用的JContextMenu中单击是否触发ActionEvent?,java,swing,Java,Swing,我有一个JContextMenu,通过调用在JDialog中打开(MouseListener已注册到JDialog): 菜单本身在菜单项上注册了ActionListener。它打开得很好,操作按预期执行,直到我打开另一个菜单(例如,应用程序的主菜单或另一个组件上的上下文菜单),该菜单与其他菜单重叠。例如,如果主菜单栏中的菜单与对话框重叠,或者如果打开了延伸到窗口外部的上下文菜单。然后单击JDialog的上下文菜单就可以关闭上下文菜单,就像您单击菜单旁边的菜单来关闭它一样(不过应用程序中的其他菜单

我有一个JContextMenu,通过调用在JDialog中打开(MouseListener已注册到JDialog):

菜单本身在菜单项上注册了ActionListener。它打开得很好,操作按预期执行,直到我打开另一个菜单(例如,应用程序的主菜单或另一个组件上的上下文菜单),该菜单与其他菜单重叠。例如,如果主菜单栏中的菜单与对话框重叠,或者如果打开了延伸到窗口外部的上下文菜单。然后单击JDialog的上下文菜单就可以关闭上下文菜单,就像您单击菜单旁边的菜单来关闭它一样(不过应用程序中的其他菜单仍然可以)

这就好像点击菜单一样。如果我用箭头键选择一个菜单项并按enter键,它会很好地完成操作

例如,如果我在
菜单.show()
中将应用程序的主窗口指定为调用者,那么它似乎总是工作的(当然,它在错误的位置打开)。似乎有效的方法是在JDialog的内容窗格上注册鼠标侦听器

有人能解释是什么导致这种行为吗?出于某种原因,JDialog不应该被用作上下文菜单的调用者吗


我还尝试使用了
setComponentPopupMenu()
,但这似乎只适用于JComponent,而不适用于JDialog或其内容窗格。在JDialog内部的组件上使用它是可行的,但是使用鼠标侦听器和
菜单.show()

的另一种方法也是可行的。如果没有完整的示例,我不确定是否可以解释您的结果,但是
setComponentPopupMenu()
可以在添加到对话框内容窗格中的
JPanel
上使用。下面的代码基于此


由于没有完整的示例,我不确定是否可以解释您的结果,但是
setComponentPopupMenu()
适用于添加到对话框内容窗格的
JPanel
。下面的代码基于此


由于没有完整的示例,我不确定是否可以解释您的结果,但是
setComponentPopupMenu()
适用于添加到对话框内容窗格的
JPanel
。下面的代码基于此


由于没有完整的示例,我不确定是否可以解释您的结果,但是
setComponentPopupMenu()
适用于添加到对话框内容窗格的
JPanel
。下面的代码基于此


请考虑添加一个问题。您尝试过<代码> SETIGNITIOSPOPPUP(真)吗?请考虑添加一个问题。您尝试过“代码> SETIGNITIPSOPPUP菜单(true)< /COD>吗?请考虑添加一个问题。您尝试过代码> SETIGNITIPSOPPUP菜单(TRUE)吗?请考虑添加一个重新创建的问题。您尝试过“代码> SETIONITSPOPPUP菜单(TRUE)< /代码>吗?
menu.show(e.getComponent(), e.getX(), e.getY());
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;

/**
 * @see https://stackoverflow.com/a/22100940/230513
 * @see https://stackoverflow.com/questions/5129294
 */
public class Test {

    private void display() {
        JDialog d = new JDialog();
        d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        final ImagePanel imagePanel = new ImagePanel();
        d.add(new JScrollPane(imagePanel));
        d.setJMenuBar(imagePanel.menuBar);
        d.pack();
        d.setLocationRelativeTo(null);
        d.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().display();
            }
        });
    }

    private static class ImagePanel extends JPanel {

        private static final int MASK
            = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
        private JFileChooser chooser = new JFileChooser();
        private Action openAction = new ImageOpenAction("Open");
        private Action clearAction = new ClearAction("Clear");
        private JMenuBar menuBar = new JMenuBar();
        private JPopupMenu popup = new JPopupMenu();
        private BufferedImage image;

        public ImagePanel() {
            this.setComponentPopupMenu(popup);
            popup.add("Popup Menu");
            popup.add(new JMenuItem(openAction));
            popup.add(new JMenuItem(clearAction));
            JMenu menu = new JMenu("File");
            menu.setMnemonic('F');
            menu.add(new JMenuItem(openAction));
            menu.add(new JMenuItem(clearAction));
            menuBar.add(menu);
        }

        @Override
        public Dimension getPreferredSize() {
            if (image == null) {
                return new Dimension(320, 240);
            } else {
                return new Dimension(image.getWidth(), image.getHeight());
            }
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, null);
        }

        private class ClearAction extends AbstractAction {

            public ClearAction(String name) {
                super(name);
                this.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_C);
                this.putValue(Action.ACCELERATOR_KEY,
                    KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK));
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                image = null;
                revalidate();
                repaint();
            }
        }

        private class ImageOpenAction extends AbstractAction {

            public ImageOpenAction(String name) {
                super(name);
                this.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_O);
                this.putValue(Action.ACCELERATOR_KEY,
                    KeyStroke.getKeyStroke(KeyEvent.VK_O, MASK));
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                int returnVal = chooser.showOpenDialog(chooser);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File f = chooser.getSelectedFile();
                    try {
                        image = ImageIO.read(f);
                        revalidate();
                        repaint();
                    } catch (IOException ex) {
                        ex.printStackTrace(System.err);
                    }
                }
            }
        }
    }
}