【问题标题】:Game in Java won't respond to key pressesJava中的游戏不会响应按键
【发布时间】:2013-12-31 13:25:52
【问题描述】:

我刚刚将我制作的 Java 游戏导出到 Runnable JAR。

游戏有一个打开屏幕(一个名为OpeningScreen 的类扩展了JPanel)。当您按下 ENTER 时,它应该从开始屏幕转到游戏本身(创建一个新的 Board 实例并将其添加到 JPanel。) 它在 Eclipse 中运行良好。

在具有main() 的类中创建OpeningScreen 的实例,命名为Starter

导出时,我将 Starter 类设置为“启动配置”,并将“库处理”设置为“提取所需的库到生成的 JAR”。

导出后,我得到一个窗口说它导出时出现编译错误,但没有告诉我具体是哪些错误。

从生成的 JAR 启动程序时,会显示启动屏幕,但按 ENTER 不会启动游戏,尽管它在 Eclipse 中可以运行。

这是OpeningScreen的代码:

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;

public class OpeningScreen extends JPanel implements KeyListener{

    private static final long serialVersionUID = 1L;
    public OpeningScreen(){
        setFocusable(true);
        setVisible(true);
        addKeyListener(this);
    }

    public void paint(Graphics g){

        super.paint(g);
        setBackground(Color.BLACK);

        Graphics2D g2d = (Graphics2D) g;

        // A lot of drawing Strings.

    }


    public void startGame(){

        JFrame frame = new JFrame("Pong Battle");
        frame.setSize(500,500);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Board board = new Board();
        frame.add(board);

        frame.setVisible(true);
    }

    @Override
    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();
        if(key==KeyEvent.VK_ENTER)startGame();

    }

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

}

编辑:Starter 类:

import javax.swing.*;
import java.awt.*;

public class Starter extends JFrame {

    public Starter(){

        setSize(500,500);
        setResizable(false);
        setTitle("Pong Battle");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        OpeningScreen openingS = new OpeningScreen();
        add(openingS);

        setVisible(true);

    }

    public static void main(String[]args){
        Starter starter = new Starter();
    }

}

可能是什么问题?谢谢

【问题讨论】:

  • 1) 对于 Swing,通常在基于 AWT 的较低级别 KeyListener 上使用键绑定。有关如何使用它们的详细信息,请参阅How to Use Key Bindings。 2) 对于 Swing,它是 paintComponent(Graphics) 而不是 paint(..) 3) 问题是面板既不能聚焦也没有焦点。 4) 为了尽快获得更好的帮助,请发布SSCCE。 5) 这些同样的问题一天会出现一两次。在询问之前,您真的会搜索群组吗?
  • 你的意思是面板既不能聚焦也没有焦点?我调用了 setFocusable(true)。
  • 哦,我的错。再说一次,这次要大声一点 如需尽快获得更好的帮助,请发帖 SSCCE
  • 当然,但是既然你已经在这里了,你能帮我解决这个问题吗?
  • 你能在这里发布一些真正血腥的东西吗? 由于缺少课程,垃圾收集没有。

标签: java swing jar


【解决方案1】:

不要使用 KeyListener。您应该使用键绑定。

请参阅 Motion Using the Keyboard 了解原因和工作示例。

【讨论】:

    【解决方案2】:

    您的开始屏幕需要添加到另一个容器中,然后是另一个 Jframe

    1. 创建另一个 JFrame。
    2. 不加装饰。 f.setUndecorated(true)
    3. 将打开屏幕面板设为内容面板f.setContentPane(new OpeningPanel())
    4. 显示此框架。
    5. 按下 Enter 键后,删除开始屏幕框架。 f.dispose()
    6. 然后调用 startGame()

    【讨论】:

    • 但是一个OpeningScreen的实例被添加到Starter,它扩展了JFrame。是这个意思吗?
    • JPanel 需要 setFocusable 和/或更好地将 KeyBIndinds 用于简单的 KeyEvents(最多按下 3 个键)
    • 该列表在第 1 点出现问题。请参阅 The Use of Multiple JFrames, Good/Bad Practice?
    • 谢谢安德鲁,必须想出另一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多