其他类中的KeyListener

时间:2014-12-14 11:14:53

标签: java jframe

我遇到KeyListener问题,我想将keylistener功能分离到其他类,所以我有:

JGame.java

 package jgame;

import javax.swing.JFrame;

public class JGame extends JFrame {

    public JGame() {
        Actions act = new Actions();
        addKeyListener(act);
        setFocusable(true);
    }


    public static void main(String[] args) {

        JFrame frame = new JFrame();
        JGame keys_ = new JGame();
        frame.add(keys_);
        frame.setSize(600, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }
}

和Actions.java

package jgame;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Actions implements KeyListener {

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == 32) {
            System.out.println("Pressed spacebar");
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
}

当我运行此应用程序时,netBeans consol说:  "线程中的异常" main" java.lang.IllegalArgumentException:向容器添加窗口     在java.awt.Container.checkNotAWindow(Container.java:488)     at java.awt.Container.addImpl(Container.java:1089)     at java.awt.Container.add(Container.java:1003)     在javax.swing.JFrame.addImpl(JFrame.java:564)     在java.awt.Container.add(Container.java:415)     在jgame.JGame.main(JGame.java:18) Java结果:1 "

3 个答案:

答案 0 :(得分:0)

您正在尝试在致电

时向JFrame添加JFrame
JFrame frame = new JFrame();
JGame keys_ = new JGame();
frame.add(keys_);

JGame扩展JFrame。这是不可能的。一种解决方案是让JGame代替JPanel

请参阅JFrame inside another JFrame以获取参考。

答案 1 :(得分:0)

您无法将Window Class添加到另一个窗口中。

因为这个类将是结束GUI。您可以在其中添加其他组件。

答案 2 :(得分:0)

嗯,你的冲突就在这里:

        JFrame frame = new JFrame();
        JGame keys_ = new JGame();
        frame.add(keys_);

你不能将Frame添加到另一个JFrame,我建议你使用 JinternalFrame

您可能想要使用JDesktopPane,然后将框架的内容窗格设置为桌面窗格:

JDesktopPane desktop = new JDesktopPane(); //a specialized layered pane
    createFrame(); //create first "window"
    setContentPane(desktop);

尝试将 JGame设为JinternalFrame ,而不是使用 JDesktopPane

将其添加到JFrame

see How to Use Internal Frames