Связывание MouseEvent / MouseListener с привязками ActionMap / InputMap в Java - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть что-то вроде уникальной проблемы. В настоящее время я пытаюсь кодировать события мыши в свою программу, своего рода игровой движок. Моя проблема:

Когда мышь щелкают / отпускают, я хочу вызвать код, который уже был написан, как действие для клавиши Enter.

В моем классе Binds я связываю ввод с моим действием следующим образом:

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. Вызов вручную кода ActionMap в методе mouseClicked (MouseEvent e).

Я пытался найти способы выполнения того и другого, но, похоже, не существует способа делать это. Кроме того, у меня нет ActionListeners в моем коде. Я использую их с моими кнопками J, но не с привязками клавиш. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Что я смогу сделать? Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 18 апреля 2020

Переместите код в закрытый метод:

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

Затем вызовите этот метод из методов ActionMap и MouseListener:

actionMap.put("ENTER", e -> doAction());

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