当前位置: 首页 > 知识库问答 >
问题:

JFrame、JPanel、KeyListener问题

公良高刚
2023-03-14
import javax.swing.JFrame;

public class Main extends JFrame {

public Board board = new Board();

public Main() {
    add(board);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
    setVisible(true);
}

public static void main(String args[]) {
    new Main();
}
import javax.swing.JPanel;

public class Board extends JPanel {

public TextLabel textLabel1 = new TextLabel("Hi", "Hello", "Bye");
public TextLabel textLabel2 = new TextLabel("Bye", "GoodBye", "Farewell");

public Board() {

    addKeyListener(textLabel1); //this could be a ball in my game
    addKeyListener(textLabel2); //this could be something else...
    add(textLabel1);
    add(textLabel2);
    setFocusable(true);
}
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JLabel;

public class TextLabel extends JLabel implements KeyListener {

private String txt1, txt2;

public TextLabel(String text, String txt1, String txt2) {
    setText(text);
    this.txt1 = txt1;
    this.txt2 = txt2;
}
public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();

    if (key == KeyEvent.VK_A) {
        setText(txt1);
    }

    if (key == KeyEvent.VK_L) {
        setText(txt2);
    }

}
@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

}
@Override
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}
}

共有1个答案

丁钟展
2023-03-14

如果你希望你的简单游戏是内存/CPU高效的,我建议采取一个完全不同的路线。

  1. 使用Gameloop。似乎您没有使用任何类型的操作监听器或循环来处理更新。你需要一些东西来处理更新,比如当玩家从a点移动到B点时,你需要一种方法来不断增加实体的坐标,直到它到达目的地。ActionListener和使用Swing计时器将适用于简单的游戏,但如果您想在将来认真对待游戏开发,请从正确的方式开始。

public类Main{public static void Main(String[]args){Game Game=new Game();//init JFrame并将Game添加到其中

        game.start();
        while(game.isRunning()) {
            game.update();
            game.repaint();
        }
    }
}

class Game extends Canvas {
    private boolean running = true;
    private Ball ball = new Ball(0, 0, 50, 50);

    public void start() {   
        running = true;
    }

    public void stop() {
        //clean-up
        running = false;
    }

    public void update() { //update game logic
        ball.update();
    }

    @Override
    public void paint(Graphics g) { //render game
        super.paint(g); //clears previous graphics

        ball.render(g); //passes graphics down to entity
    }
}

这将给你一个清晰的设计你的游戏,以及分离渲染与游戏逻辑。这是球课的样子

class Ball {
    private int currentX, currentY, width, height;

    public Ball(int x, int y, int w, int h) {
        currentX = x; currentY = y;
        width = w; height = h;
    }

    public void update() {
        currentX++; //moves ball to right
    }

    public void render(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillRect(currentX, currentY, width, height);
    }
}

您会注意到,当运行这样的东西时,CPU使用率会相当高。这是因为控制游戏的while循环以极快的速度循环。有许多方法可以精确定时地减缓这一速度。我将向您展示一个非常简单的方法:

int fps = 30;
int oneNanoSec = 1000000000;
int secondsPerLoop = oneNanoSecond/fps; //divide a second into 30 slices
while(game.isRunning()) {
    long start = System.nanoTime(); //see what time it is when we start

    game.update();
    game.render();

    long end = System.nanoTime(); //see what time it is when the game is finished updating/rendering
    long sleepTime = secondsPerLoop - (end-start);

    if(sleepTime > 0) {
        try {
            Thread.sleep(sleepTime);
        }catch(InterruptedException e) {
            e.printStackTrace();
        }
    } else
        Thread.yield();
}

这个计时器会看到更新和渲染花了多长时间,然后根据你想要更新/渲染的速度,运行游戏的线程会Hibernate(暂停)。

 类似资料:
  • 有人能告诉我为什么这也不管用吗?(我的第二个动作监听器是我的游戏所需的其他东西)

  • 我正在尝试实现一个简单的keylistener,用左键箭头绘制椭圆形移动的图形。在使用系统进行测试后,椭圆形不会移动,甚至不会读取按键。出来普林顿。任何帮助都将不胜感激。

  • 问题内容: 我有一个使用从扩展的类的子类 我将一个对象添加到框架-中。现在,当我按下任意键盘键时,不会调用任何方法,并且似乎没有窗口焦点。我也尝试过调用,但仍然没有响应。 如何使它响应按键? 问题答案: 您是否为面板设置了面板本身?另外,您可能需要将面板设置为可聚焦。我通过此代码对其进行了测试,它似乎可以正常工作

  • 问题内容: 我正在做一个涉及JPanel中的鼠标和键监听器的小项目。不幸的是,当我使用鼠标/键盘时,没有一个方法被调用。我之前曾使用过JPanels / JFrame / JApplet和JComponents。代码片段如下所示: 偏离主题:我不断收到错误消息您的帖子似乎包含格式错误的代码。请使用代码工具栏按钮或CTRL + K键盘快捷键将所有代码缩进4个空格。要获得更多编辑帮助,请单击[?]工具

  • 不久前,我通过教程和视频开始学习Java,在了解了一些东西(按钮、布局、音频和其他一些东西的工作原理)之后,我现在的目标之一是创建一个小型交互式游戏。 我在主课上写了相当大一部分的游戏,效果很好,但过了一段时间就变得一团糟了。 所以我决定从一开始就尝试另一次,对游戏的每个部分使用不同的类,让代码看起来更清晰易懂。 但我从一开始就有一个问题,在论坛上搜索了几个小时的教程和答案,但没有找到一个准确的答

  • 下面的代码,如下所示: 扩展JFrame。但是我也需要它来扩展JPanel,以便制作一个透明的JPanel。问题是我不能同时扩展这两个,java会犯一个错误: 如果我扩展了JPanel,我就可以生成一个透明的JPanel,但是程序不能运行,因为在几行代码中有一个错误(如果我扩展了JFrame,这个错误就会消失)。 然而,如果我扩展JFrame,程序将运行得很好,但它使我无法执行透明的JPanel。