gpt4 book ai didi

java - 我的 KeyListener 无法读取按键输入

转载 作者:行者123 更新时间:2023-12-02 10:59:20 24 4
gpt4 key购买 nike

现在,我有一个扩展 JPanel 并实现 KeyListener 的类。我已将此类实例化为在循环中运行它的另一个类。 KeyListener 类看起来像

public class Keyboard extends JPanel implements KeyListener{


public Keyboard()
{
this.addKeyListener(this);
}

public void update()
{

}

@Override
public void keyPressed(KeyEvent e)
{

if(keyCode == KeyEvent.VK_S){
System.out.println("Made it");
}
}


@Override
public void keyReleased(KeyEvent e)
{
}

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

我在另一个类中实现了这个,该类在 Game 类中使用了 MouseListener ,效果很好。但由于某种原因,它不会监听键盘。

public class Main

{

public static final int WIDTH = 640;
public static final int HEIGHT = 640;
public static final String NAME = "Game";

private static BufferedImage image;
private static Graphics2D g;
private static boolean forceQuit;

private static Game game;
private static Keyboard keyboard;

public Main(){

}

private static void init()
{
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
g = (Graphics2D) image.getGraphics();
g.setBackground(Color.BLACK);

game = new Game();
keyboard = new Keyboard();
}

private static void start()
{
run();
}

public static void stop()
{
forceQuit = true;
}

public static void run()
{
@SuppressWarnings("unused")
int frames = 0;

double unprocessedSeconds = 0;
long lastTime = System.nanoTime();
double secondsPerTick = 1.0 / 60.0;
int tickCount = 0;

while (!forceQuit)
{
if(keyboard.isSwampland()){
game.setSwampland(true);
}

long now = System.nanoTime();
long passedTime = now - lastTime;
lastTime = now;
if (passedTime < 0)
passedTime = 0;
if (passedTime > 100000000)
passedTime = 100000000;

unprocessedSeconds += passedTime / 1000000000.0;

boolean ticked = false;
while (unprocessedSeconds > secondsPerTick)
{
game.update();
keyboard.update();
unprocessedSeconds -= secondsPerTick;
ticked = true;

tickCount++;
if (tickCount % 60 == 0)
{
// System.out.println("FPS:" + frames);
lastTime += 1000;
frames = 0;
}
}

if (ticked)
{
game.render(g);

Graphics gg = game.getGraphics();
gg.drawImage(image, 0, 0, null);
gg.dispose();

frames++;
}
else
{
try
{
Thread.sleep(1);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}



}
}

public static void main(String[] args)
{
Main.init();

JFrame frame = new JFrame(NAME);
frame.setDefaultCloseOperation(3);
frame.setContentPane(game);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

Main.start();
}

}

最佳答案

好吧,有很多问题......

简短的回答...

使用Key Bindings API ,它克服了 KeyListener API

的缺点

长答案...

KeyListener 仅在注册的组件可聚焦且具有键盘焦点时才会生成 KeyEvent

我发现您的代码存在问题......

  • 键盘实际上并未添加到任何内容,因此它不会显示在屏幕上,因此它永远无法获得焦点。
  • KeyListener确实应该直接注册到Game,只是需要管理的组件较少​​
  • 不建议在 Component 中使用 getGraphics,这不是绘制的方式。 Swing 组件默认情况下是双缓冲的,因此通常最好利用它的内置绘画过程,如果您真的想控制绘画过程,则应该使用 Canvas >BufferStrategy,否则会面临在绘制代码和 API 现有绘制过程之间生成竞争条件的风险

关于java - 我的 KeyListener 无法读取按键输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51461114/

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