gpt4 book ai didi

java - 将 KeyListener 和 JFrame 分成 2 个不同的类

转载 作者:行者123 更新时间:2023-12-02 03:38:47 26 4
gpt4 key购买 nike

我将向您展示两个不同的代码来演示我的要求。第一个代码工作正常,它在一个类中包含 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 和您用 this 引用的 Fgui。因此,将这些参数放入 KeyL 的构造函数中(作为两个 JLabel 和一个 JFrame),然后对它们调用您的方法。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com