我将向您展示两个不同的代码,以演示我的要求。
第一个代码工作正常,它将JFrame和KeyListener包含在一个类中,但是我想要将它们分开。

下面的第一个代码...

public class Fgui extends JFrame implements KeyListener{

private JPanel jp;
private Icon background = new ImageIcon(getClass().getResource("back2.png"));
private Icon monster = new ImageIcon(getClass().getResource("mol.png"));
protected JLabel mon;
private JLabel backG;
protected int monX = 300;
private int monY = 225;
protected int monDX = 0;
private int monDY = 0;
protected JLabel ct = new JLabel("Change Text");
protected int code;

public Fgui(){

    super("Crazy Monster Eating Game");
    this.setSize(750,400);
    this.setLayout(null);

    mon = new JLabel(monster);
    backG = new JLabel(background);

    this.addKeyListener(this);

    this.add(mon);
    mon.setSize(150,150);
    mon.setLocation(monX, 225);

    this.add(ct);
    ct.setSize(750,20);
    ct.setLocation(0,0);

    this.add(backG);
    backG.setSize(750,400);
    backG.setLocation(0,0);
}
public void keyPressed(KeyEvent e) {
    code = e.getKeyCode();
    if(code == KeyEvent.VK_LEFT){

        monDX = -40;
        ct.setText("left key pressed");
        monX = monDX+monX;

        }
    else if(code == KeyEvent.VK_RIGHT){

        monDX = 40;
        ct.setText("right key pressed");
        monX = monDX+monX;

}else if(code == KeyEvent.VK_ESCAPE){

    try{ct.setText("ESC key pressed");
    this.dispose();}catch(Exception excep){System.out.println("Failed to EXIT!");}

}else{
    ct.setText("Key not registred");
    }
    mon.setLocation(monX, 225);
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}


然后,我试图将它们分开,并得到以下代码,

第二码...

JFrame一半

public class Fgui extends JFrame {

private JPanel jp;
private Icon background = new ImageIcon(getClass().getResource("back2.png"));
private Icon monster = new ImageIcon(getClass().getResource("mol.png"));
protected JLabel mon;
private JLabel backG;
protected int monX = 300;
private int monY = 225;
protected int monDX = 0;
private int monDY = 0;
protected JLabel ct = new JLabel("Change Text");
protected int code;

public Fgui(){

    super("Crazy Monster Eating Game");
    this.setSize(750,400);
    this.setLayout(null);

    mon = new JLabel(monster);
    backG = new JLabel(background);

    KeyL KeyLObj = new KeyL();
    this.addKeyListener(KeyLObj);

    this.add(mon);
    mon.setSize(150,150);
    mon.setLocation(monX, 225);

    this.add(ct);
    ct.setSize(750,20);
    ct.setLocation(0,0);

    this.add(backG);
    backG.setSize(750,400);
    backG.setLocation(0,0);
}

}


一半的KeyListener

public class KeyL extends Fgui implements KeyListener{

public void keyPressed(KeyEvent e) {
    code = e.getKeyCode();
    if(code == KeyEvent.VK_LEFT){

        monDX = -40;
        ct.setText("left key pressed");
        monX = monDX+monX;

        }
    else if(code == KeyEvent.VK_RIGHT){

        monDX = 40;
        ct.setText("right key pressed");
        monX = monDX+monX;

}else if(code == KeyEvent.VK_ESCAPE){

    try{ct.setText("ESC key pressed");
    this.dispose();}catch(Exception excep){System.out.println("Failed to EXIT!");}

}else{
    ct.setText("Key not registred");
    }
    mon.setLocation(monX, 225);
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}


这里的第二代码有两个单独的类,一个是JFrame类,另一个是KeyListener类,但是当我编译它时,它不起作用。我认为这是我以错误的方式添加addKeyListener语句的问题。

KeyL KeyLObj = new KeyL();
    this.addKeyListener(KeyLObj);


我尝试通过KeyL类添加它,但是它也不起作用。

我想要这样做的原因是因为我不希望将代码限制在一个类中,而是将其分成2个以使其看起来更加干净。如果我想添加更多关键事件,我可以在那一堂课中做。

最佳答案

您看到的问题非常简单。因为您将KeyL设为Fgui的子类,所以每次构造新的KeyL时,所有Fgui初始化代码都将运行。

这样您就可以到达这一行:

KeyL KeyLObj = new KeyL();


这将创建一个新的KeyL,因此在该行结束之前,必须创建一个新的KeyL对象。由于KeyLFgui,因此会调用Fgui构造函数。并且FGui构造函数最终到达同一行KeyL KeyLObj = new KeyL();,因此该过程会重复。您永远都不会越过这一行,因为每个新的KeyL在完全构建之前都需要创建另一个KeyL,因此该程序将不断制作新的对象,直到空间用完。

答案是KeyL没有理由成为Fgui。使它仅实现KeyListener,而不扩展Fgui。然后,确保它可以访问完成任务所需的所有变量。

您的大多数变量都不应该是对象中的字段。它们应该只是局部变量。不需要在该函数之外存在的任何内容,或在两次调用之间保留其值的任何内容,都应更改为局部变量。看起来只重要的两个是monct和用Fgui引用的this。因此,请将这些参数放入KeyL的构造函数中(作为两个JLabel和一个JFrame),然后在这些参数上调用您的方法。

关于java - 将KeyListener和JFrame分为2个不同的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37095446/

10-15 11:10