【问题标题】:Exported game not working correctly导出的游戏无法正常运行
【发布时间】:2015-07-05 01:15:07
【问题描述】:

我制作了一个简单的 Java 游戏,它由 2 个类(使用 JFrame)组成。我试图将它导出到一个 Runnable jar,但由于某种原因,当我尝试运行它时它永远无法工作。谢谢!

这是我的代码:

主类

    RussianRoulette game = new RussianRoulette();
    game.setVisible(true);
    game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    game.setSize(220, 200);
    game.setResizable(false);

}
}

其他类

int lives = 5;
JTextField livesDisplay;
JButton gunButton;
ImageIcon gunCold;
ImageIcon gunActive;
JOptionPane endPane = new JOptionPane();
int endProgram;
int clicked = 0;
JTextField display;


public RussianRoulette() {
    super("Russian Roulette");
    Font font = new Font("Western", 20, 20);

    gunCold = new ImageIcon(getClass().getResource("guncold.gif"));
    gunActive = new ImageIcon(getClass().getResource("gunactive.gif"));

    JPanel buttonPanel = new JPanel();
    JPanel livesPanel = new JPanel();
    JPanel displayPanel = new JPanel();

    display = new JTextField("  Click Gun To Play!", 15);

    livesDisplay = new JTextField("Lives: " + lives, 8);
    livesDisplay.setEditable(false);
    livesDisplay.setFont(font);
    livesDisplay.setBackground(Color.BLACK);
    livesDisplay.setForeground(Color.WHITE);

    livesPanel.add(livesDisplay);
    livesPanel.setBackground(Color.BLACK);

    displayPanel.add(display);
    displayPanel.setBackground(Color.BLACK);
    display.setFont(font);
    display.setEditable(false);
    display.setBackground(Color.BLACK);
    display.setForeground(Color.WHITE);

    LayoutManager overlay = new OverlayLayout(buttonPanel);
    buttonPanel.setLayout(overlay);
    buttonPanel.setBackground(Color.BLACK);
    gunButton = new JButton(gunCold);
    gunButton.setToolTipText("Click To Pull Trigger");
    gunButton.setAlignmentX(0.4f);
    gunButton.setAlignmentY(0.0f);
    buttonPanel.add(gunButton);

    add(buttonPanel, BorderLayout.CENTER);
    add(livesPanel, BorderLayout.NORTH);
    add(displayPanel, BorderLayout.SOUTH);

    gunButton.addActionListener(new ActionListener() {
        @SuppressWarnings("static-access")
        public void actionPerformed(ActionEvent event) {
            Random r = new Random();
            int rand = r.nextInt(6);
            clicked++;
            switch (rand) {
            case 0:
                display.setText(" Bang! You lost a life.");
                lives--;
                livesDisplay.setText("Lives: " + lives);
                break;
            case 1:
                display.setText("      You're alive!");
                break;
            case 2:
                display.setText("      You're alive!");
                break;
            case 3:
                display.setText("      You're alive!");
                break;
            case 4:
                display.setText("      You're alive!");
                break;
            case 5:
                display.setText("      You're alive!");
                break;
            }

            Timer imageSwitch = new Timer(984, new TimerListener());
            imageSwitch.setRepeats(false);
            if (rand == 0) {
                imageSwitch.start();
                gunButton.setIcon(gunActive);
            } else {
                gunButton.setIcon(gunCold);
            }

            if (lives == 0) {
                JFrame end = new JFrame();
                endPane = new JOptionPane();
                end.add(endPane);
                endProgram = endPane.showOptionDialog(null, "You survived "
                        + clicked + " trigger pulls!", "Game Over",
                        endPane.OK_CANCEL_OPTION,
                        endPane.INFORMATION_MESSAGE, null, null, null);

                if (endProgram == endPane.OK_OPTION) {
                    System.exit(0);
                } else if (endProgram == endPane.CANCEL_OPTION) {
                    System.exit(0);
                } else if (endProgram == endPane.CLOSED_OPTION) {
                    System.exit(0);
                }
            }

        }

    });
}

private class TimerListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        gunButton.setIcon(gunCold);

    }

    {
        if (lives == 0) {
            display.setText("  Bang! You're dead.");
        }
    }

}

}

【问题讨论】:

  • 你设置主类了吗?双击它会发生什么?什么都没有?
  • @FastSnail 我导出了主类和子类,当我双击它时,几秒钟后我收到一条错误消息“无法启动 Java jar 文件”。跨度>
  • @Tom 我刚刚尝试过,但没有成功。它做了一件奇怪的事情,每隔一段时间,枪按钮就会变白并缩小到它的三分之一大小
  • 你能从控制台运行你的应用程序吗?只需打开一个控制台,使用cd path/to/file 切换到jar 文件的位置,然后运行java -jar YourJarFile.jar。我猜如果你运行它,你会得到一个NullPointerException

标签: java jar jframe


【解决方案1】:

我想通了。我必须将图像的路径设置为项目中的一个包,其中包含我的图片。

gunCold = new ImageIcon(getClass().getClassLoader().getResource("images/guncold.gif"));
gunActive = new ImageIcon(getClass().getClassLoader().getResource("images/gunactive.gif"));

【讨论】:

  • @Tom 是的,我知道。之后我做了最后一件事,我在我的项目中创建了一个名为“images”的包并将图像放在那里。然后我将两个图像图标的路径设置为包中的图片。
  • @Tom 我做了 getClass().getClassLoader().getResource("images/guncold.gif");然后我对另一张照片做了同样的事情
  • @Tom 刚刚做了。谢谢你的帮助!我将在 2 小时内接受我的回答,因为它说我必须等待。
  • 是的,您必须避免一段时间才能接受自己的答案(据我所知,这个时间取决于问题的发布日期)。顺便说一句,我在你的回答下删除了我的 cmets 来清理一下:D.
猜你喜欢
  • 1970-01-01
  • 2018-01-01
  • 2021-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多