当前位置: 首页 > 知识库问答 >
问题:

从popmenu操作事件获取右键单击位置

戴树
2023-03-14

我有一个java程序,当在JPanel中右键单击时打开弹出菜单。当任何弹出菜单项被单击时,我想打印触发终端中弹出菜单的右键单击的位置。我该怎么办?我如何从弹出操作事件中获取右键单击发生的位置?

如果弹出菜单位于JComponent中,代码将如何更改?

这是节目。

    import java.awt.EventQueue;
    import java.awt.event.*;
    import javax.swing.*;

    public class MenuTest
    {
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    MenuFrame frame = new MenuFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            });
        }
    }

    class MenuFrame extends JFrame
    {
        public MenuFrame()
        {
            setTitle("MenuTest");
            setSize(300, 200);

            Action cutAction = new TestAction("Cut");
            Action copyAction = new TestAction("Copy");
            Action pasteAction = new TestAction("Paste");

            JPopupMenu popup = new JPopupMenu();
            popup.add(cutAction);
            popup.add(copyAction);
            popup.add(pasteAction);

            JPanel panel = new JPanel();
            panel.setComponentPopupMenu(popup);
            add(panel);

            panel.addMouseListener(new MouseAdapter() {});
        }

        class TestAction extends AbstractAction
        {
            public TestAction(String name)
            {
                super(name);
            }

            public void actionPerformed(ActionEvent event)
            {
                System.out.println("Right click happened at ?"); // How do I get right click location?          
            }
        }
    }

共有3个答案

袁凌
2023-03-14

这是我要找的代码。谢谢希皮和加勒特的帮助。

    import java.awt.EventQueue;
    import java.awt.event.*;
    import javax.swing.*;
    import java.awt.geom.*;

    public class MenuTest
    {
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    MenuFrame frame = new MenuFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);
                }
            });
        }
    }

    class MenuFrame extends JFrame
    {
        public MenuFrame()
        {
            setTitle("MenuTest");
            setSize(300, 200);

            Action cutAction = new TestAction("Cut");
            Action copyAction = new TestAction("Copy");
            Action pasteAction = new TestAction("Paste");

            JPopupMenu popup = new JPopupMenu();
            popup.add(cutAction);
            popup.add(copyAction);
            popup.add(pasteAction);

            JPanel panel = new JPanel();
            panel.setComponentPopupMenu(popup);
            add(panel);

            panel.addMouseListener(new MouseAdapter() { 
                @Override
                public void mousePressed(MouseEvent e) {
                    clickLocation= e.getPoint();
                }
            });
        }

        class TestAction extends AbstractAction
        {
            public TestAction(String name)
            {
                super(name);
            }

            public void actionPerformed(ActionEvent event)
            {
                System.out.println("Right click happened at (" + clickLocation.getX()+"," + clickLocation.getY()+ ")");         
            }
        }

        private Point2D clickLocation;
    }
莫誉
2023-03-14

你在正确的轨道上。我个人更喜欢在MouseAdapter中手动显示它,这样我就可以在其他mouseevent上添加方法。为此,您可能需要删除面板。setComponentPopupMenu(弹出菜单)

panel.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent arg0) {
            if (arg0.getButton() == MouseEvent.BUTTON3) { //Button3 is rightclick
                popup.show(panel, arg0.getX(), arg0.getY());
            }
        }
});

颜宸
2023-03-14

向按下的事件添加鼠标侦听器(单击的事件通过弹出窗口捕获):

    panel.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            clickLocation.setSize(e.getX(), e.getY());
        }
    });
    Action cutAction = new TestAction("Cut", clickLocation);
    Action copyAction = new TestAction("Copy", clickLocation);
    Action pasteAction = new TestAction("Paste", clickLocation);

打印尺寸:

    private Dimension clickLocation;

    public TestAction(String name, Dimension clickLocation) {
        super(name);
        this.clickLocation = clickLocation;
    }

    public void actionPerformed(ActionEvent event) {
        System.out.println("Right click happened at " + clickLocation);
    }
 类似资料:
  • 我的自定义子类重写,以便在右键单击(ctrl单击)时显示上下文菜单。 我创建了一个带有适当目标/操作的菜单项,并将其添加到菜单中。 我想实例化一个子视图,并将其放置在最初发生右键单击的位置;然而,目前尚不清楚如何获取导致菜单显示的原始点击事件的位置。 action方法的参数获取NSMenuItem实例,但它似乎没有任何属性来确定其在屏幕上的位置(或其superview)。 如何确定初始右键单击事件

  • 问题内容: 右键单击Javascript事件吗?如果可以,该如何使用? 问题答案: 正如其他人提到的那样,可以[通过常规鼠标事件(mousedown,mouseup,click)检测[鼠标右键。但是,如果在弹出右键单击菜单时正在寻找触发事件,那么您所寻找的位置是错误的。也可以通过键盘(在Windows和某些Linux上为shift + F10或上下文菜单键)访问右键单击/上下文菜单。在这种情况下,

  • 问题内容: 在我的三个按钮上,鼠标=中键单击和=右键单击。 两键鼠标就是这种情况吗? 谢谢 问题答案: 为了避免任何歧义,请使用SwingUtilities中的实用程序方法:

  • 问题内容: 我想阻止标准上下文菜单,并手动处理右键单击事件。 怎么做? 问题答案: 使用事件。 这是一个例子: 并使用事件监听器: 不要忘记返回false,否则仍会弹出标准上下文菜单。 如果要使用编写的函数而不是,请记住在函数和属性中都返回false 。

  • 问题内容: 有没有一种方法可以设置一个元素,使其在左键单击(ng-click)上执行一个动作,然后在右键单击上执行另一个动作? 现在我有类似的东西: 而且我还希望能够右键单击范围以执行函数decrement();。 问题答案: 您可以使用指令,使用event 绑定右键单击时的特定操作: 小提琴上的代码示例

  • 问题内容: 对于Windows和Linux,我能够检测到右键单击。但是对于Mac,我不知道如何检测右键单击。 如何编写Java程序以检测Mac OS的右键单击 感谢Sunil KUmar Sahoo 问题答案: 这与检测Windows或Linux上的右键单击相同–您调用给定的MouseEvent的方法来检查是否被单击。例如,看一下示例MouseListener的以下代码片段: 但是,这仅在用户实际