如何让 keyEvent 在 Java 中工作?
How to get keyEvent to work in Java?
我对编程完全陌生Java。我无法让我的 keyEvent
s 无法工作。我正在制作的小游戏需要这个。这是我的代码:
package markusrytter.pingpong;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class main extends JPanel implements KeyListener {
static int ballX;
static int ballY;
static int ballR = 15;
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.fillOval(ballX - ballR, ballY - ballR, ballR * 2, ballR * 2);
}
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame("Sample Frame");
main game = new main();
frame.add(game);
frame.setSize(1400, 800);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
ballX = frame.getContentPane().getSize().width / 2;
ballY = frame.getContentPane().getSize().height / 2;
while (true) {
game.repaint();
Thread.sleep(10);
}
}
public void keyPressed(KeyEvent e) {
System.out.println("A key is Pressed: " + e.getKeyCode());
if(e.getKeyCode() == KeyEvent.VK_SPACE){
System.out.println("Spacebutton pressed");
}
}
}
我希望有人能提供帮助,我曾尝试观看视频,但我还是 java 的新手。
最重要的是:更改 class 的名称。它被称为主要,这是一个坏主意。此外,更明智的做法是覆盖 paintComponent()
而不是 paint
.
您没有将密钥监听器添加到 JFrame
。您应该在 after creating game
:
中调用它
frame.addKeyListener(game);
您还需要添加剩余的 KeyListener
方法。
应该就可以了。
您的代码无法编译,因为您没有(完全)实现 KeyListener
您没有在面板的构造函数中添加按键侦听器。
KeyEvents 只发送给有焦点的组件。您的面板不可聚焦,因此它永远不会收到事件。您使用方法 setFocusable(true)
.
不要覆盖 paint()。相反,您应该覆盖 paintComponent(...)
.
您甚至不应该使用 KeyListener。相反,当使用 Swing 时,您应该使用 Key Bindings
.
不要对 class.
的属性使用静态变量
您的 GUI 不是在 Event Dispatch Thread (EDT)
上创建的。
i have read articles, i have watched videos, and done everything exactly like them,
显然不行,否则它会起作用。
要获得正确的教程,请从 Swing Tutorial 开始。有以下部分:
- 如何编写 KeyListener
- 自定义绘画
- 按键绑定。
- 并发
我对编程完全陌生Java。我无法让我的 keyEvent
s 无法工作。我正在制作的小游戏需要这个。这是我的代码:
package markusrytter.pingpong;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class main extends JPanel implements KeyListener {
static int ballX;
static int ballY;
static int ballR = 15;
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.fillOval(ballX - ballR, ballY - ballR, ballR * 2, ballR * 2);
}
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame("Sample Frame");
main game = new main();
frame.add(game);
frame.setSize(1400, 800);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
ballX = frame.getContentPane().getSize().width / 2;
ballY = frame.getContentPane().getSize().height / 2;
while (true) {
game.repaint();
Thread.sleep(10);
}
}
public void keyPressed(KeyEvent e) {
System.out.println("A key is Pressed: " + e.getKeyCode());
if(e.getKeyCode() == KeyEvent.VK_SPACE){
System.out.println("Spacebutton pressed");
}
}
}
我希望有人能提供帮助,我曾尝试观看视频,但我还是 java 的新手。
最重要的是:更改 class 的名称。它被称为主要,这是一个坏主意。此外,更明智的做法是覆盖 paintComponent()
而不是 paint
.
您没有将密钥监听器添加到 JFrame
。您应该在 after creating game
:
frame.addKeyListener(game);
您还需要添加剩余的 KeyListener
方法。
应该就可以了。
您的代码无法编译,因为您没有(完全)实现 KeyListener
您没有在面板的构造函数中添加按键侦听器。
KeyEvents 只发送给有焦点的组件。您的面板不可聚焦,因此它永远不会收到事件。您使用方法
setFocusable(true)
.不要覆盖 paint()。相反,您应该覆盖
paintComponent(...)
.您甚至不应该使用 KeyListener。相反,当使用 Swing 时,您应该使用
Key Bindings
.不要对 class.
的属性使用静态变量
您的 GUI 不是在
Event Dispatch Thread (EDT)
上创建的。
i have read articles, i have watched videos, and done everything exactly like them,
显然不行,否则它会起作用。
要获得正确的教程,请从 Swing Tutorial 开始。有以下部分:
- 如何编写 KeyListener
- 自定义绘画
- 按键绑定。
- 并发