1

我正在做一些非常基本的编码,只是想学习键绑定背后的基本概念。这一切看起来都非常简单,但是我的逻辑或结构存在问题,导致我的代码无法按照我想要的方式执行。

这是我的代码

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();
}

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

任何帮助表示赞赏,谢谢。

4

3 回答 3

4

改变

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或者只是放 number 3

于 2013-07-30T01:17:11.203 回答
3

我可以看到的直接问题是以下语句

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

KeyStroke.getKeyStroke("s")会回来的null。传递给此方法的要求String非常特殊,并且没有很好的记录(恕我直言)。

您可以KeyStroke.getKeyStroke("S")改用,但我更喜欢使用KeyStroke.getKeyStroke(KeyEvent.VK_S, 0),因为声明中没有歧义。

我还建议您为输入地图定义焦点边界......

而不是panel.getInputMap(),尝试使用panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)确保在窗口获得焦点时触发键事件

看看JComponent#getInputMap更多细节。

如果您还没有这样做,您还应该看看如何使用键绑定

于 2013-07-30T01:16:44.760 回答
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
}

这是屏幕截图: 在此处输入图像描述

于 2013-07-30T01:45:14.290 回答