当前位置: 首页 > 知识库问答 >
问题:

当从另一个JFrame遍历时,键侦听器在一个JFrame中不起作用

茅星雨
2023-03-14

我有两节课。

一个扩展canvas并在内部创建一个jframe,将canvas添加到该jframe,并添加另一个keyadapter类以接收键事件。我也有主要的函数来测试代码。当从main运行时,表单将显示并接收关键事件。

现在我创建了另一个扩展jframe并实现keylistener以接收这种形式的事件的类。

在第二个类中完成功能后,我想关闭第二个表单并显示第一个表单。当从第二个类中的键事件函数显示它时,第一个类的键侦听器不工作。

请看一下我的代码并告诉我如何纠正我的问题。感谢您的时间和宝贵的建议。

第1类

public class Test extends Canvas {

private JFrame container;

public Test() {

    container = new JFrame("Space Invaders");
    JPanel panel = (JPanel) container.getContentPane();
    panel.setPreferredSize(new Dimension(screenSize.width, screenSize.height));
    panel.setLayout(null);
    setBounds(0, 0, screenSize.width, screenSize.height);
    panel.add(this);
    container.pack();
    container.setResizable(false);
    container.setVisible(true);

    try {

        addKeyListener(new KeyInputHandler(this));
    } catch (Exception e) {
        e.printStackTrace();
    }
    requestFocus();
}

private class KeyInputHandler extends KeyAdapter {

public void keyPressed(KeyEvent e) {
    //Some Action
}
public void keyReleased(KeyEvent e) {
    //Some Action
}
public void keyTyped(KeyEvent e) {
    //Some Action
}
}

public static void main(String args[]){
    //Running this canvas here works perfectly with all added keylisteners
}
}
public class Sample extends JFrame implements KeyListener {

public Sample() {
    init();
    this.setSize(100, 100);
    this.setVisible(true);
    Sample.this.dispose();
            // Created a window here and doing some operation and finally redirecting
            // to the previous test window. Even now the test window works perfectly
            // with all keylisteners
    new Test();
}

public static void main(String[] args) {
    new Sample();

}

private void init() {
    addKeyListener(this);
}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {
    removeKeyListener(this);
    Sample.this.dispose();
            // But when calling the previous Test window here, the window 
            // gets displayed but the keylistener is not added to the 
            // window. No keys are detected in test window.
    new Test();
}

@Override
public void keyReleased(KeyEvent e) {

}
}

共有1个答案

隆飞宇
2023-03-14

简单的不要使用keylistener/keyadapter,它用于AWT组件,并且与Swing一起使用时有已知的焦点问题。

通过setFocusable(true)确保组件可聚焦,并在添加组件/组件可见后调用RequestFocusInWindown()来解决这些问题。

而是使用keybindings进行Swing。

public static void addKeyBindings(JComponent jc) {
    jc.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "D pressed");
    jc.getActionMap().put("D pressed", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            System.out.println("D pressed");
        }
    });

    jc.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "D released");
    jc.getActionMap().put("D released", new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            System.out.println("D released");
        }
    });
}

我们将此方法称为:

JPanel ourPanel=new JPanel();

...

addKeyBindings(ourPanel);//adds keybindings to the panel

有关守则的其他建议

>

  • 始终通过SwingUtilities.Invokelater(Runnable r)块在事件调度线程上创建和操作Swing组件

  •  类似资料:
    • 我有3个不同的JFrames。一个是一个登录页面,另一个有,第三个是主页。现在我想要的是,当我们登录时,我想在登录页面上方显示,并在完成进度到100%时,我想关闭两个框架并打开第三个,这是主页。请好心帮我完成这项工作。谢谢//这是代码部分。 }//这打开我的进度条的第二个JFrame //在Progressbar页面的下一页,我有这个代码 //现在我想要的是,在进度条完成后,我想处理登录页面和只打

    • 问题内容: 我下棋。我写了3节课。如果是游戏则为第一。(棋盘,棋子等),另外一个用于菜单。(新,打开,设置时间等按钮) 他们两个都使用JFrame。 我想将上述两个类都放在第3类中。例如,“游戏”窗口在左侧,菜单在右侧。第三类还将通过JFrame显示整个应用程序。 怎么做? 问题答案: 您不能将一个JFrame放入另一个。您在这里有几个设计选择。您可以将JFrames更改为JPanels。这可能是

    • 问题内容: 众所周知,我是一名完全的Java新手。我已经尝试过对此进行研究(通过阅读StackOverflow上的其他文章,谷歌搜索,并问一个不太喜欢Java新手的朋友),但我不知道。答案可能是明确而容易的,但我对此视而不见。我正在尝试从其他框架中放置A。 我的应用程序应该按以下方式工作: 按下框架X时有一个按钮:产生框架Y 框架Y有一个按钮,当按下时:产生框架Z 按下框架Z时有一个按钮:在放置框

    • EDIT2:测试过了。这无疑是新JPanel的一个问题。 解决方案:正如建议的那样,答案是我忘了明确地将我的JPanel设置到JFrame上。改变: 到 这对我很管用! 我的问题是JFrame的一个奇怪行为。 在我的代码中,我的主机上有一个单选按钮。按下时,会打开另一个框架。 在我的新框架里,我做了一个JPanel。在添加JPanel之前,另一个框架没有冻结,所以我相信问题与新的JPanel有关。

    • 很多人可能都知道,我是一个完全的Java新手。我已经尝试过对此进行研究(通过阅读StackOverflow上的其他帖子,在谷歌上搜索,并询问一位不太熟悉java的朋友),但我无法理解。答案可能很清楚也很简单,但我对此视而不见。我试图从不同的帧中处理JFrame。 我的应用程序应该按如下方式工作: 帧X有一个按钮,按下时:生成帧Y 帧Y有一个按钮,按下时:生成帧Z Frame Z有一个按钮,按下时:

    • 问题内容: 嗨,我试图将一些文本附加到同一包中另一个类的一个小问题。以下是与JFrame有关的主要类: 我包括测试变量只是为了轻松地重新创建问题,但是无论何时运行append函数,jFrame的文本区域中都不会出现任何内容。在我的方案中,我让客户端从服务器接收文本,然后将其附加到文本框中。 顺便说一句,我正在为JFrame使用IntelliJ GUI设计器。我只包含了重新创建问题所需的代码。我仍在