有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用键绑定的java

我正在做一些非常基本的编码,只是试图学习键绑定背后的基本概念。这一切看起来都很简单,但我的逻辑或结构有问题,使我的代码无法按我希望的方式执行

这是我的密码

public class Board {

ButtonListener buttonlistener;  
EnterAction enterAction;

public Board(){

    JFrame skeleton = new JFrame();
    skeleton.setDefaultCloseOperation(EXIT_ON_CLOSE);
    skeleton.setVisible(true);
    skeleton.setSize(400, 400);

    buttonlistener = new ButtonListener();
    enterAction = new EnterAction();

    JPanel panel = new JPanel();
    panel.setBackground(Color.BLACK);

    JButton button = new JButton("button");
    button.addActionListener(buttonlistener);
    panel.add(button);
    skeleton.add(panel);        
    panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction");
    panel.getActionMap().put("doEnterAction", enterAction);

}

public class ButtonListener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent arg0) {     
        System.out.println("button pressed");
    }       
}

public class EnterAction extends AbstractAction{
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("enter pressed");    
    }       
}

public static void main(String[] args){
    new Board();
}

所以,这应该很简单。正如你所看到的,我只是想让它在你按下enter键时打印出“按下enter键”,但它不会打印出任何内容(除非你点击上面代码中显示的按钮)。此外,在eclipse中,Entreaction类用黄色下划线,我认为它可能没有被正确调用,但我不知道为什么它不会被正确调用

非常感谢您的帮助,谢谢


共 (2) 个答案

  1. # 1 楼答案

    改变

    panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction");
    

    panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("S"), "doEnterAction");
    

    还有

    skeleton.setDefaultCloseOperation(EXIT_ON_CLOSE);

    参数必须为JFrame.EXIT_ON_CLOSE或仅输入数字3

  2. # 2 楼答案

    我认为Azad和MadProgrammer是正确的,我只需要做一个简单的改变,除了他们建议的,让程序运行。我已经为代码中的三个项目编号,作为注释:(复制并粘贴,您就可以开始了)

    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.KeyStroke;
    
    public class Board {
    
        ButtonListener buttonlistener;
        EnterAction enterAction;
    
        public Board() {
    
            JFrame skeleton = new JFrame();
            //Change #1 below 
            skeleton.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            skeleton.setVisible(true);
            skeleton.setSize(400, 400);
    
            buttonlistener = new ButtonListener();
            enterAction = new EnterAction();
    
            JPanel panel = new JPanel();
            panel.setBackground(Color.BLACK);
    
            JButton button = new JButton("button");
            button.addActionListener(buttonlistener);
            panel.add(button);
            skeleton.add(panel);
            //Change #2 below
            panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
                    KeyStroke.getKeyStroke("S"), "doEnterAction");
            panel.getActionMap().put("doEnterAction", (Action) enterAction);
    
        }
    
        public class ButtonListener implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("button pressed");
            }
        }
    
        public class EnterAction extends AbstractAction {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("enter pressed");
            }
        }
    
        public static void main(String[] args) {
            new Board();
        }
        //Change #3 below
    }
    

    以下是截图: enter image description here