gpt4 book ai didi

Java:帮助使用 KeyAdapter

转载 作者:行者123 更新时间:2023-11-29 05:40:18 27 4
gpt4 key购买 nike

我正在使用 Java 尝试制作一款基本游戏,但在使用 KeyAdapter 时遇到了一些问题。我以前使用过一种非常相似的格式,并认为我理解它,但这让我感到难过。

任何帮助将不胜感激,这是我正在使用的主要代码

public class Board extends JPanel implements ActionListener{

Timer timer;
Tank tank = new Tank();

boolean boardset;

public Board(){
setBackground(Color.BLACK);

ImageIcon alien1ii = new ImageIcon(this.getClass().getResource("si_Alien1.png"));
Image alien1 = alien1ii.getImage();
ImageIcon alien2ii = new ImageIcon(this.getClass().getResource("si_Alien2.png"));
Image alien2 = alien2ii.getImage();
ImageIcon alien3ii = new ImageIcon(this.getClass().getResource("si_Alien3.png"));
Image alien3 = alien3ii.getImage();

timer = new Timer(5, this);
timer.start();

addKeyListener(new TAdapter());

JButton button = new JButton(new AbstractAction("hello2"){
@Override
public void actionPerformed(ActionEvent e){
boardset = false;
}
});
this.add(button);

//actual game
setFocusable(true);
setDoubleBuffered(true);
}

public void paint(Graphics g){
super.paint(g);
g.setColor(Color.WHITE);

Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(tank.getTank(), tank.getx(), tank.getY(), this);

g2d.drawLine(0, (tank.getY()+25), 400, (tank.getY()+25));

Toolkit.getDefaultToolkit().sync();
g.dispose();
}

public class TAdapter extends KeyAdapter{
public void keyPressed(KeyEvent e){
tank.keyPressed(e);
System.out.println("pressedddddddddddddddddd");
}
public void keyReleased(KeyEvent e){
tank.keyReleased(e);
}
}

public void setBoardset(boolean x){
boardset = x;
}

public boolean getBoardset(){
return boardset;
}

@Override
public void actionPerformed(ActionEvent e) {
repaint();
tank.move();
}

}

在我看来这应该非常简单,现在我正在使用这个打印语句来查看该类是否真的能够识别击键: 公共(public)类 TAdapter 扩展 KeyAdapter{ public void keyPressed(KeyEvent e){ tank.keyPressed(e); System.out.println("presseddddddddddddddddddd");

但是,没有输出。所以我怀疑它根本无法识别任何击键。但我不知道为什么。如果有人有任何建议,我将不胜感激。显然,如果有人认为这对解决此错误有用,我可以分享更多代码。

最佳答案

1)使用KeyBindings KeyListener 有两个大问题,首先你要听所有的键,其次你必须有焦点并且可以集中注意力。取而代之的是 KeyBinding,您可以绑定(bind)一个键,而不必集中注意力。

简单示例:

AbstractAction escapeAction = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
//code here example
((JComponent)e.getSource()).setVisible(Boolean.FALSE);
}};
String key = "ESCAPE";
KeyStroke keyStroke = KeyStroke.getKeyStroke(key);
component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, key);
component.getActionMap().put(key, escapeAction);

您可以使用这些 JComponent 常量

WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 
WHEN_FOCUSED
WHEN_IN_FOCUSED_WINDOW

2) 如果完全没有必要,不要使用具体的继承。

3) 不要在顶级类中实现 ActionListener,参见 Single Responsability Principle例子改变这个:

public class Board extends JPanel implements ActionListener{

到:

 public class Board{
private JPanel panel;

private class MyActionListener implements ActionListener{
//code here
}
}

4) 不要使用继承,例如在你的 KeyAdapter 中,你不添加任何东西,只使用 KeyAdapter (现在你将要使用键绑定(bind),所以这是无用的,但要知道:))。

5) 重写时添加@Override注解,同时在swing中重写paintComponent(..)而不是paint(..)

关于Java:帮助使用 KeyAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17871388/

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