java - 如何为 JFrame 中的对象实现 KeyListener?
问题描述
我正在尝试为学校项目制作 Java 中的 Frogger,但我在为实际的青蛙角色设置 KeyListener 时遇到了很多困难。
我尝试设置键绑定,请求 JPanel 和 JFrame 的焦点,在角色开始的位置移动,但似乎没有任何效果。这是我尝试的残余。
这是运行我的游戏的程序。
import javax.swing.*;
public class Frogger
{
JFrame frame = new JFrame("Frogger");
CPT c = new CPT();
public Frogger()
{
frame.setBounds(0,0,700,500);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(c);
}
public static void main(String[] args){
new Frogger();
}
}
主要游戏
public CPT() {
setLayout(new BorderLayout());
label = new JLabel("Frogger");
frame1 = new JFrame("Main");
label.setFont(new Font("Serif", Font.BOLD,50));
label.setBounds(275,10,250,250);
button1 = new JButton("PLAY");
button1.setBounds(300,350,100,50);
button1.setOpaque(false);
button1.setVisible(true);
this.setOpaque(false);
this.setLayout(null);
this.add(label);
button1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setVisible(true);
frame1.setSize(700,500);
frame1.setResizable(false);
frame1.setFocusable(false);
button1.setVisible(false);
frame1.add(new TrainCanvas());
frame1.add(p1);
p1.requestFocus();
}
});
this.add(button1); }
这是在游戏中绘制汽车和青蛙的 TrainCanvas 类
class TrainCanvas extends JComponent
{
private int lastX = 0;
private int lastX_1 = 0;
private int lastX_2 = 0;
public TrainCanvas() {
Thread animationThread = new Thread(new Runnable() {
public void run() {
while (true) {
repaint();
try {Thread.sleep(10);} catch (Exception ex) {}
}
}
});
animationThread.start();
}
public void paintComponent(Graphics g) {
Graphics2D gg = (Graphics2D) g;
//Draws Train 1
int w = getWidth();
int h = getHeight();
int trainW_1 = 100;
int trainH_1 = 5;
int trainSpeed_1 = 3;
int x = lastX + trainSpeed_1;
if (x > w + trainW_1) {
x = -trainW_1;
}
gg.setColor(Color.BLACK);
gg.fillRect(x, h/2 + trainH_1, trainW_1, trainH_1);
lastX = x;
Graphics2D g3 = (Graphics2D) g;
frog = new Rectangle(f_x,f_y,25,25);
g3.fill(frog);
g3.setColor(Color.GREEN);
}
}
最后,关键监听器
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()== KeyEvent.VK_UP)
{
CPT.f_y -= 100;
repaint();
}
else if(e.getKeyCode()== KeyEvent.VK_RIGHT)
{
CPT.f_x += 100;
repaint();
}
else if(e.getKeyCode() == KeyEvent.VK_LEFT)
{
CPT.f_x -= 100;
repaint();
}
else if(e.getKeyCode()==KeyEvent.VK_DOWN)
{
CPT.f_y += 100;
repaint();
}
else {}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}
该程序运行得非常好,没有给我任何错误,这使得这很麻烦。每当它进入主游戏窗口时,似乎没有一个键起作用。
解决方案
推荐阅读
- javascript - SoundCloud URL 的正则表达式
- javascript - 如何使用 javasript 将图像尺寸设置为 parentNode 作为属性?
- listview - Flutter:提供者:使用更新的数据重建消费者小部件,但不重新绘制包含元素的 ListView
- azure-devops - 如何从 DevOps 发布管道运行 Connect-AzureAD?
- r - 如何使用 Rstudio 打开从 RStudio 生成的 .eps 图
- spring - 在测试文件夹 Spring 中定义一个 JPA 存储库
- javascript - 我如何获得按钮的排名
- c - CLion 解决方法使错误变得更糟
- swift - .NSCalendarDayChanged 仅在应用程序处于前台时观察到
- javascript - 让 i 总是等于 undefined 但 var i 是在 for 循环中定义的