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