我有一个带有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收听?

最佳答案

您可以使其他面板无法聚焦,但是这可能还需要使这些面板上的每个组件都无法聚焦。

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

10-07 22:32