java - 在 Java 中将 MouseEvent/MouseListener 链接到 ActionMap/InputMap 绑定(bind)

标签 java events mouseevent key-bindings

我遇到了一个似乎有些独特的问题。我目前正在尝试将鼠标事件编码到我的程序中,即某种游戏引擎。我的问题是:

当单击/释放鼠标时,我想调用已经编写为 Enter 键操作的代码。

在我的 Binds 类中,我将 Enter 链接到我的操作,如下所示:

public class Binds extends InputMap
{
    public Binds(JPanel object)
    {
        // InputMap stuff
        InputMap inputMap = object.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false), "ESCAPE");
    }
}

与对应的ActionMap:

ActionMap actionMap = game.getActionMap(); //game is an object which extends JPanel.
actionMap.put("ENTER", new AbstractAction(){
    @Override
    public void actionPerformed(ActionEvent e)
    {
        //A very excessive amount of code    
    }
} 

我不想将代码复制粘贴到 ActionMap 中,并且希望保持代码简单。有什么方法可以链接我的 MouseEvent/MouseListener 以便它手动执行此代码吗?

我想到过但无法实现的两种方法包括:

  1. 将 MouseListener 添加到 inputMap
  2. 在 mouseClicked(MouseEvent e) 方法中手动调用 ActionMap 代码。

我尝试过寻找同时做到这两点的方法,但似乎没有办法这样做。另外,我的代码中没有 ActionListener。我将它们与我的 JButton 一起使用,但不与我的按键绑定(bind)一起使用。如果您需要任何其他信息,请告诉我。

我能做什么?非常感谢您的帮助。

最佳答案

将代码移至私有(private)方法:

private void doAction() {
    //A very excessive amount of code    
}

然后从 ActionMap 和 MouseListener 方法中调用该方法:

actionMap.put("ENTER",
    new AbstractAction() {
        private static final long serialVersionUID = 1;

        @Override
        public void actionPerformed(ActionEvent event) {
            doAction();
        }
    });

gamePanel.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseReleased(MouseEvent event) {
        doAction();
    }
});

关于java - 在 Java 中将 MouseEvent/MouseListener 链接到 ActionMap/InputMap 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61281052/

相关文章:

java包名约定失败

Java:获取带有泛型参数的类的类

Java - 访问在不同的 'if/else if' 语句中创建的对象?

java - Hibernate:检索列表

c# - 从 C# 中的 EventHandler<T> 确定事件名称

c++ - 用C++点击鼠标

c# - 如何从另一个应用程序的文本框中获取插入符号位置? (不是坐标,而是文本框内的实际索引)

vb.net - 将处理程序添加到动态创建的上下文菜单

mysql - 事件执行期间保存的时间不正确

python - 绘制 networkx.Graph : how to change node position instead of resetting every node?