可运行JAR不';使用JavaFX时无法打开

可运行JAR不';使用JavaFX时无法打开,java,javafx,Java,Javafx,我正在尝试制作一个类似于Wumpus的游戏,到目前为止,它在Eclipse中运行得非常完美。我目前只在其Media和MediaPlayer类中使用JavaFX。我决定将游戏导出为一个可运行的JAR,看看它是否能运行,但当我双击JAR运行程序时,什么也没发生。但是,如果我通过命令提示符运行runnable JAR文件,程序就会打开并运行良好。当我回到代码中,删除任何与JavaFX相关的内容,然后将其导出为可运行的JAR时,JAR打开了,程序运行良好,不需要任何命令提示符。如果有人能帮我弄清楚为什么

我正在尝试制作一个类似于Wumpus的游戏,到目前为止,它在Eclipse中运行得非常完美。我目前只在其Media和MediaPlayer类中使用JavaFX。我决定将游戏导出为一个可运行的JAR,看看它是否能运行,但当我双击JAR运行程序时,什么也没发生。但是,如果我通过命令提示符运行runnable JAR文件,程序就会打开并运行良好。当我回到代码中,删除任何与JavaFX相关的内容,然后将其导出为可运行的JAR时,JAR打开了,程序运行良好,不需要任何命令提示符。如果有人能帮我弄清楚为什么会发生这种情况,以及我如何解决这个问题,我将不胜感激!这是来自主类的代码,如果它有帮助的话(可能真的很混乱)

打包游戏;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
导入javafx.application.application;
导入javafx.scene.media.media;
导入javafx.scene.media.MediaPlayer;
导入javafx.stage.stage;
公共类游戏扩展应用程序实现ActionListener、KeyListener{
公共静态博弈;
私有JFrame;
私人定时器;
私家车;
私人瓷砖[][]瓷砖;
私人玩家;
私人媒体主题;
私人媒体播放器音乐播放器;
公共JLabel explosionGIF;
公共游戏(){
frame=newjframe(GameData.frame\u NAME);
explosionGIF=新的JLabel();
定时器=新定时器(GameData.UPDATE\u SPEED\u MS,此选项);
渲染器=新渲染器();
renderer.setPreferredSize(新维度(GameData.FRAME_WIDTH,GameData.FRAME_HEIGHT));
frame.add(渲染器);
frame.setresizeable(true);
frame.setVisible(true);
frame.pack();
frame.setLocationRelativeTo(空);
frame.addKeyListener(这个);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
初始化();
timer.start();
}
私有void初始化(){
tiles=新Tile[GameData.Tile_AMOUNT][GameData.Tile_AMOUNT];
对于(int r=0;r
为了在命令行上运行,您输入的完整命令是什么?java-jar Wumpus.jar我怀疑您的系统配置为在双击.jar文件时调用java 11或更高版本。Java11不再包括JavaFX;必须单独下载(免费)。但是,您的命令行似乎调用了早于11的版本,这可能是由于您的
PATH
环境变量造成的。我该如何解决这个问题?如果我在另一台没有下载JavaFX的笔记本电脑上运行它,它会不再工作吗?正确,它将不再工作。您需要将JavaFX运行时与应用程序一起分发。JavaFX除了.jar文件之外还包括本机库,因此您可以在Java11中创建一个,也可以使用JavaFX运行时的副本分发您的应用程序,并添加一个短脚本,以使用适当的
-classpath
选项和
-Djava.library.path=…
运行您的应用程序
package game;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

import javafx.application.Application;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.Stage;

public class Game extends Application implements ActionListener, KeyListener {

public static Game game;
private JFrame frame;
private Timer timer;
private Renderer renderer;
private Tile[][] tiles;
private Player player;
private Media themeSong;
private MediaPlayer musicPlayer;
public JLabel explosionGIF;

public Game() {
    frame = new JFrame(GameData.FRAME_NAME);
    explosionGIF = new JLabel();
    timer = new Timer(GameData.UPDATE_SPEED_MS, this);
    renderer = new Renderer();
    renderer.setPreferredSize(new Dimension(GameData.FRAME_WIDTH, GameData.FRAME_HEIGHT));
    frame.add(renderer);
    frame.setResizable(true);
    frame.setVisible(true);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.addKeyListener(this);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    initialize();
    timer.start();
}

private void initialize() {
    tiles = new Tile[GameData.TILE_AMOUNT][GameData.TILE_AMOUNT];
    for (int r = 0; r < tiles.length; r++) {
        for (int c = 0; c < tiles[r].length; c++) {
            tiles[r][c] = new Tile(r, c);
        }
    }
    player = new Player();
    GameData.FRAME_WIDTH_DIFFERENCE = frame.getWidth() - GameData.FRAME_WIDTH;
    GameData.FRAME_HEIGHT_DIFFERENCE = frame.getHeight() - GameData.FRAME_HEIGHT;
}

private void startMusic() {

    musicPlayer.play();
}

public void render(Graphics g) {
    for (Tile[] tileArr : tiles)
        for (Tile tile : tileArr)
            tile.render(g);
    player.render(g);
}

private void update() {
    updateSize();
    if (musicPlayer != null && (musicPlayer.getCurrentTime().greaterThanOrEqualTo(musicPlayer.getStopTime())
            || musicPlayer.getCurrentTime().compareTo(musicPlayer.getStartTime()) == 0)) {
        startMusic();
    }
}

private void updateSize() {
    if (frame.getPreferredSize().getWidth() != GameData.FRAME_WIDTH
            || frame.getPreferredSize().getHeight() != GameData.FRAME_HEIGHT) {
        renderer.setPreferredSize(new Dimension(frame.getWidth() - GameData.FRAME_WIDTH_DIFFERENCE,
                frame.getHeight() - GameData.FRAME_HEIGHT_DIFFERENCE));
        GameData.FRAME_WIDTH = (int) frame.getWidth() - GameData.FRAME_WIDTH_DIFFERENCE;
        GameData.FRAME_HEIGHT = (int) frame.getHeight() - GameData.FRAME_HEIGHT_DIFFERENCE;
        GameData.TILE_WIDTH = GameData.FRAME_WIDTH / GameData.TILE_AMOUNT;
        GameData.TILE_HEIGHT = GameData.FRAME_HEIGHT / GameData.TILE_AMOUNT;
    }
}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {

}

@Override
public void keyReleased(KeyEvent e) {
    switch (e.getKeyCode()) {
    case KeyEvent.VK_LEFT:
        player.move(GameData.MovementDirections.LEFT);
        break;
    case KeyEvent.VK_RIGHT:
        player.move(GameData.MovementDirections.RIGHT);
        break;
    case KeyEvent.VK_UP:
        player.move(GameData.MovementDirections.UP);
        break;
    case KeyEvent.VK_DOWN:
        player.move(GameData.MovementDirections.DOWN);
        break;
    case KeyEvent.VK_SPACE:
        break;
    }
}

@Override
public void actionPerformed(ActionEvent e) {
    renderer.repaint();
    update();
}

public JFrame getFrame() {
    return frame;
}

public Tile[][] getTiles() {
    return tiles;
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            game = new Game();
        }
    });
    Application.launch();
}

@Override
public void start(Stage primaryStage) throws Exception {
    // TODO Auto-generated method stub
    themeSong = new Media(getClass().getResource("/sound/theme.mp3").toExternalForm());
    musicPlayer = new MediaPlayer(themeSong);
}

}