Java 调试非';不要被俘

Java 调试非';不要被俘,java,key-bindings,Java,Key Bindings,由于我已经为JFrame中的每个JPanel添加了绑定,我假设在按下W键时至少会触发其中一个。我的击键是否不正确 SSCCE: public class TestTemp extends JFrame { public TestTemp() { setSize(1000, 800); JPanel parentPanel = new JPanel(new MigLayout("", "grow, fill", "grow

由于我已经为JFrame中的每个JPanel添加了绑定,我假设在按下
W
键时至少会触发其中一个。我的
击键是否不正确

SSCCE:

public class TestTemp extends JFrame {

    public TestTemp() {
        setSize(1000, 800);

        JPanel parentPanel = new JPanel(new MigLayout("", "grow, fill",
                "grow, fill"));
        parentPanel.setBackground(Color.GREEN);
        setContentPane(parentPanel);
        parentPanel.setSize(1000, 800);

        JPanel videoPanel = new JPanel();
        videoPanel.setBackground(Color.CYAN);

        JPanel contentPanel = new JPanel();
        contentPanel.setLayout(new MigLayout("fillx", "[fill]", "[nogrid]"));
        contentPanel.setBackground(Color.YELLOW);

        parentPanel.getInputMap().put(KeyStroke.getKeyStroke("W"), new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("W pressed, parent panel");          
            }                   
        });     

        contentPanel.getInputMap().put(KeyStroke.getKeyStroke("W"), new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("W pressed, content panel");         
            }                   
        });

        videoPanel.getInputMap().put(KeyStroke.getKeyStroke("W"), new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("W pressed, video panel");           
            }                   
        });

        parentPanel.add(videoPanel, "wmin 200");
        parentPanel.add(contentPanel);
    }


    public static void main(String[] args) {
        JFrame frame = new TestTemp();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
编辑: 我尝试使用以下方法为父面板提供焦点:

parentPanel.setFocusable(true);
parentPanel.requestFocus();
但它似乎没有任何效果

编辑2: 为了确保不是错误的击键,我使用了文档在示例中给出的击键:

KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)
但是,再次点击[code>Enter
没有效果。

试试这个:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import net.miginfocom.swing.MigLayout;

public class T extends JFrame {

    public T() {
        setSize(1000, 800);

        JPanel parentPanel = new JPanel(new MigLayout("", "grow, fill",
                "grow, fill"));
        parentPanel.setBackground(Color.GREEN);
        getContentPane().add(parentPanel);
        parentPanel.setSize(1000, 800);

        JPanel videoPanel = new JPanel();
        videoPanel.setBackground(Color.CYAN);

        JPanel contentPanel = new JPanel();
        contentPanel.setLayout(new MigLayout("fillx", "[fill]", "[nogrid]"));
        contentPanel.setBackground(Color.YELLOW);

        parentPanel.getActionMap().put("enter", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Enter pressed, parent panel");
            }
        });

        InputMap inputMap = parentPanel.getInputMap();
        inputMap.put( KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "enter");

        parentPanel.add(videoPanel, "wmin 200");
        parentPanel.add(contentPanel);
    }


    public static void main(String[] args) {
        JFrame frame = new T();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
我不认为布局是个问题

  • 使用
    getActionMap
    而不是
    getInputMap
    等待操作事件
  • 分离
    InputMap
    以侦听击键
  • enter
    键盘事件现在写入标准输出

    有关详细信息,请参见以下链接:

    一般来说,当你遇到难题时,尽量让最简单的案例起作用。一旦你有了最简单的案例(例如,一个面板接受键盘输入),然后建立在复杂性之上。例如,您甚至可以删除MigLayout,以查看它是否影响键盘输入