как привязать ESC к ключу

#java #eclipse #key-bindings

#java #eclipse #привязки клавиш

Вопрос:

Моя проблема в том, что ESC ничего не делает, хотя это тот же код, что и для w, a и s, которые работают, и когда я нажимаю кнопку, w, a и s больше не работают. Что должен делать этот код, так это отображать JFrame с JLabel, который должен перемещаться вверх, вниз, влево и вправо, когда я нажимаю w, s, a и ESC соответственно. это видео, которое я использовал в качестве руководства (я не подразумеваю, что это плохое видео) https://www.youtube.com/watch ?v = IyfB0u9g2x0 amp; t = 118s

 Game(){
    
        frame = new JFrame("KeyBinding Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(420,420);
        frame.setLayout(null);
        
        label = new JLabel();
        label.setBackground(Color.red);
        label.setBounds(100, 100, 100, 100);
        label.setOpaque(true);
        b = new JButton();
        b.setBackground(Color.red);
        b.setBounds(400, 400, 400, 400);
        b.setOpaque(true);
        upAction = new UpAction();
        downAction = new DownAction();
        leftAction = new LeftAction();
        rightAction = new RightAction();
        
        label.getInputMap().put(KeyStroke.getKeyStroke('w'), "upAction");
        label.getActionMap().put("upAction", upAction);
        label.getInputMap().put(KeyStroke.getKeyStroke('s'), "downAction");
        label.getActionMap().put("downAction", downAction);
        label.getInputMap().put(KeyStroke.getKeyStroke('a'), "leftAction");
        label.getActionMap().put("leftAction", leftAction);
        label.getInputMap().put(KeyStroke.getKeyStroke("ESC"), "rightAction");
        label.getActionMap().put("rightAction", rightAction);
        frame.add(b);
        frame.add(label);
        frame.setVisible(true);
    }
    
    public class UpAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX(), label.getY()-10);
        }       
    }
    public class DownAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX(), label.getY() 10);   
        }       
    }
    public class LeftAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX()-10, label.getY());   
        }       
    }
    public class RightAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX() 10, label.getY());
        }       
    }
}
 

Вот где я его запускаю

 public class Main{
    public static void main(String[] args ){
        Game game = new Game();
    }
}
 

Ответ №1:

 label.getInputMap().put(KeyStroke.getKeyStroke("ESC"), "rightAction");
 

Метка на вашей клавиатуре ничего не значит для Java.

Важны переменные, определенные в классе KeyEvent:

 VK_ESCAPE
 

Поэтому для создания нажатия клавиши вы используете:

 label.getInputMap().put(KeyStroke.getKeyStroke("ESCAPE"), "rightAction");
 

но все же, когда я нажимаю на кнопку, клавиши перестают работать

Вы используете InputMap по умолчанию, который будет работать только тогда, когда компонент имеет фокус. Существует 3 входных карты. Прочитайте руководство по Swing о том, как использовать привязки клавиш.

Вы должны использовать WHEN_ANCESTOR_OF_COMPONENT карту ввода. И привязки клавиш должны быть добавлены в панель содержимого фрейма, а не в метку.

Ответ №2:

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

 import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.KeyStroke;

class Game
{

final JLabel label;

    
Game()
{       
        var frame = new JFrame("KeyBinding Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(420,420);
        frame.setLayout(null);
        
        label = new JLabel();
        label.setBackground(Color.red);
        label.setBounds(100, 100, 100, 100);
        label.setOpaque(true);
        
        var b = new JButton();
        b.setBackground(Color.red);
        b.setBounds(400, 400, 400, 400);
        b.setOpaque(true);
        var upAction = new UpAction();
        var downAction = new DownAction();
        var leftAction = new LeftAction();
        var rightAction = new RightAction();
        
        label.getInputMap().put(KeyStroke.getKeyStroke('w'), "upAction");
        label.getActionMap().put("upAction", upAction);
        label.getInputMap().put(KeyStroke.getKeyStroke('s'), "downAction");
        label.getActionMap().put("downAction", downAction);
        label.getInputMap().put(KeyStroke.getKeyStroke('a'), "leftAction");
        label.getActionMap().put("leftAction", leftAction);
        label.getInputMap().put(KeyStroke.getKeyStroke("ESC"), "rightAction");
        label.getActionMap().put("rightAction", rightAction);
        frame.add(b);
        frame.add(label);
        frame.setVisible(true);
    }
    
    public class UpAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX(), label.getY()-10);
        }       
    }
    public class DownAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX(), label.getY() 10);   
        }       
    }
    public class LeftAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX()-10, label.getY());   
        }       
    }
    public class RightAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX() 10, label.getY());
        }       
    }

    public static void main(String[] args ){
        Game game = new Game();
    }
}
 

Тогда проблема с «ESC» заключается в том, что он, похоже, не распознает эту строку, однако он работает, когда вы предоставляете ключевой код escape, например, так:

 import java.awt.event.KeyEvent;
[...]
label.getInputMap().put(KeyStroke.getKeyStroke((char) KeyEvent.VK_ESCAPE), "rightAction");
 

Комментарии:

1. это 100% моя ошибка, я запускаю игру в другом классе, тогда она работает

2. что ж, вы исправили проблему с esc, но все равно, когда я нажимаю на кнопку, клавиши перестают работать

3. Я не сталкиваюсь с этой проблемой, если я нажимаю на кнопку, она все еще работает. Вы выполнили мой код точно так, как указано, с применением приведенных ниже изменений?

4. да, все то же самое, и я применил изменение esc, импорт также одинаков