【问题标题】:Java - JPanel and KeyListener ProblemJava - JPanel 和 KeyListener 问题
【发布时间】:2010-10-04 04:17:40
【问题描述】:

我有一个带有 3 个面板的 JFrame。我扩展了一个 App 类,然后向它添加三个面板,如下所示:

JPanel controlButtonsPanel = new GameControlButtons();
        controlButtonsPanel.setPreferredSize(new Dimension(801,60));
        controlButtonsPanel.setBorder(new LineBorder(Color.white, 1));
        constraints.anchor = GridBagConstraints.NORTHWEST;
        constraints.weightx = 2;
        constraints.weighty = 0.3;
        this.add(controlButtonsPanel, constraints);

        JPanel tempP = new JPanel();     
/`/ *** I'm going to create a Jpanel subclass for this, too, I just haven't yet.`
        tempP.setPreferredSize(new Dimension(500,838));
        tempP.setBorder(new LineBorder(Color.white, 2));
        constraints.anchor = GridBagConstraints.NORTHEAST;
        constraints.weightx = 1;
        constraints.weighty = 2;
        this.add(tempP, constraints);

        JPanel graphicsPanel = new RoofRunnerGame("Ken");
        constraints.anchor = GridBagConstraints.SOUTHWEST;
        constraints.weightx = 2;
        constraints.weighty = 1;
        graphicsPanel.setBorder(new LineBorder(Color.white, 1));
        graphicsPanel.setPreferredSize(new Dimension(800,800));
        graphicsPanel.requestFocus();
        this.add(graphicsPanel, constraints);       

我已经为 GameControlButtons 和 RoofRunnerGame 类扩展了 JPanel。我在前者中添加了一个鼠标监听器。我为后者添加了一个鼠标监听器和一个按键监听器。

** 问题:鼠标监听器对两者都正常工作,但关键监听器似乎没有在我的 RoofRunnerGame 面板中监听。**

我在网上找到了两个可能的修复方法,但想先问一下。

1) 一个是在 RoofRunnerGame 子类中调用 requestFocus()。这样做的问题是,一旦我单击了另一个面板,它就会失去焦点。 (这是一个短期修复。)

2) 提到的另一件事是使用 keyBindings。我以前从未使用过它们。如果您推荐,我会这样做,但如果可能的话,我更愿意继续使用 keyListener。

那么,你怎么看?有什么方法可以让 RoofRunnerGame 面板始终保持 KEY 监听?

【问题讨论】:

    标签: java focus jpanel setfocus


    【解决方案1】:

    您可以使其他面板不具有焦点,但也可能需要使这些面板上的每个组件都不具有焦点。

    请参阅thisthis 有关通过 ActionMap 添加键侦听器的示例。 getInputMap() 方法中的 JComponent.WHEN_IN_FOCUSED_WINDOW 标志应该允许您的面板接收输入事件,即使它没有获得焦点。

    【讨论】:

    • 键绑定怎么样?何时以及为何使用它们?在这种情况下它们是否优于 keyListeners??
    • @Dan James:我给出的示例是关于键绑定的。它们更好,因为它们更好地利用了动作(您可以对按钮、菜单项重用相同的动作),您可以指定组件何时应接收输入事件(何时获得焦点或何时位于焦点窗口中)等。他们'是比关键侦听器更高级别的抽象。
    猜你喜欢
    • 2014-06-04
    • 2012-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多