【问题标题】:Listening for key strokes in a nested panel监听嵌套面板中的击键
【发布时间】:2013-07-18 23:24:17
【问题描述】:

在下面的 Java 文件中,我创建了一个包含一个面板的框架,然后它嵌套了第二个面板。我正在尝试在嵌套面板中收听击键。我的方法是使用输入图和动作图。我发现如果我只有嵌套面板的输入映射,事情就会按预期工作。但是,如果父面板也有输入映射,则按键事件不会传递到嵌套面板。您可以通过注释和取消注释第一次调用 getInputMap().put 来观察此行为。有人对此有解决方案吗?

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class InputMapTest extends JPanel {

    public InputMapTest() {
        super(new BorderLayout());
        JPanel panel = new JPanel();
        KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
        getInputMap().put(ks, "someAction");
        getActionMap().put("someAction", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("here1");
            }
        });
        ks = KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0);
        panel.getInputMap().put(ks, "someOtherAction");
        panel.getActionMap().put("someOtherAction", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("here2");
            }
        });
        add(panel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.getContentPane().add(new InputMapTest());
                frame.setSize(800, 600);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

【问题讨论】:

  • 澄清一下,我对这个问题有三个回答,他们都建议使用键绑定。我在上面的代码中没有使用键绑定吗?
  • Doi.. 并且在文字和代码中明确说明了这一点!噪音已删除。 :P 很高兴您根据@mKorbel 的专家建议对其进行了整理。 :)

标签: java swing jpanel key-bindings


【解决方案1】:

【讨论】:

  • 这可行,尽管在我正在处理的问题中,我认为将 JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 用于父面板更合适。感谢您为我指明正确的方向!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多