首页 > 解决方案 > 如何为 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) {} 
}

该程序运行得非常好,没有给我任何错误,这使得这很麻烦。每当它进入主游戏窗口时,似乎没有一个键起作用。

标签: javaswingkeylistener

解决方案


推荐阅读