gpt4 book ai didi

java - 如何使用 KeyListener 移动 JFrame 中的矩形?

转载 作者:行者123 更新时间:2023-11-30 03:34:14 28 4
gpt4 key购买 nike

我正在尝试使用 KeyListener 在 JFrame 中移动我创建的矩形(实际上,我正在更改我创建的 X 和 Y 变量)。我想声明我希望使用键绑定(bind)。我想使用 KeyListener。话虽这么说,我似乎找不到我的逻辑有什么问题。

框架(主)类:

import java.awt.Color;
import javax.swing.JFrame;

@SuppressWarnings ("serial")
public class GameFrame extends JFrame
{
public static void main (String[] args)
{
JFrame frame = new JFrame ("Java Game");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
frame.setSize (1000, 600);
frame.getContentPane().setBackground (Color.WHITE);
frame.getContentPane().add (new GamePaint());
frame.addKeyListener (new GameController());
frame.setVisible (true);
}
}

绘画类:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;

@SuppressWarnings ("serial")
public class GamePaint extends JComponent
{
public int x;
public int y;

public void paintComponent (Graphics graphics)
{
super.paintComponent (graphics);
graphics.setColor (Color.BLACK);
graphics.fillRect (x, y, 100, 100);
}
}

Controller 类:

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

public class GameController implements KeyListener
{
GamePaint paint = new GamePaint();

public void keyPressed (KeyEvent event)
{
if (event.getKeyCode() == KeyEvent.VK_LEFT)
{
paint.x--;
paint.repaint();
}
else if (event.getKeyCode() == KeyEvent.VK_RIGHT)
{
paint.x++;
paint.repaint();
}
}

public void keyReleased (KeyEvent event) {}
public void keyTyped (KeyEvent event) {}
}

最佳答案

您正在创建 GamePaint 的多个实例...

frame.getContentPane().add (new GamePaint());

还有

public class GameController implements KeyListener
{
GamePaint paint = new GamePaint();

因此,当您的 GameController Controller 尝试更改矩形的 x/y 位置时,它不会与 的实例交互>GamePaint 实际上是在屏幕上...

相反,创建 GamePaint 的单个实例,将其添加到框架中并将引用传递给 GameController

GamePaint gp = new GamePaint();
frame.getContentPane().add (gp);
frame.addKeyListener (new GameController(gp));

并更新GameController...

public class GameController implements KeyListener
{
private GamePaint paint;
public GameController(GamePaint paint) {
this.paint = paint;

但是这种方法很奇怪......不是 GamePaint 应该接收键盘输入而不是框架吗?

相反,请考虑使用键绑定(bind) API,它解决了与 KeyListener 相关的许多其他问题。请参阅How to Use Key Bindings了解更多详情

Controller 不应直接修改 x/y 属性,而应该调用 GamePaint 类上的方法(例如, moveLeftmoveRight 等...),这样 GamePaint 就可以做出关于这意味着什么的决定...

但是,就我个人而言,我会在其中注入(inject)一个模型,该模型控制实体的位置,GamePaint 简单地绘制该模型并由 Controller 控制......但这就是我......

关于java - 如何使用 KeyListener 移动 JFrame 中的矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28357334/

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