JOptionPanel.showMessageDialog 程序通过 .jar 文件 运行 时不显示

JOptionPanel.showMessageDialog doesn't show up when program is run through the .jar file

我稍微搜索了一下我的问题的答案,但没有找到与我的答案完全匹配的内容,也许我搜索不够努力,但我是这个网站的新手。

所以我使用 NetBeans IDE 8.0.2,当我 运行 我的程序通过 IDE 时,一切正常。但是当我 运行 它通过它的可执行 Jar 文件时,我得到了前 2 个输入框,但最后的警报没有出现。

该程序简单地从输入中获取 2 个名字(球员),然后为每个人分配一个在 Fifa 中使用的球队,取自一个名为 "teams.txt" 的外部列表。我让我和我的室友在我们玩 Fifa 19 时使用它,我们想使用随机球队,但不想被 1-2 星球队困住。

public class Main {

public static void main(String[] args) {

    List<String> teams = new ArrayList<>();

    // Read file, then store each new line item in the ArrayList.
    try {
        Scanner s = new Scanner(new File("teams.txt"));

        while (s.hasNext()) {
            teams.add(s.nextLine());
        }
    } catch (FileNotFoundException ex) {
        System.out.println("File Not Found");
    }

    // Take user input from dialog box and store it in variables player1 and player2.
    String player1 = JOptionPane.showInputDialog("Player 1: Enter your name.");
    String player2 = JOptionPane.showInputDialog("Player 2: Enter your name.");
    //Print the values given in the Java console.
    System.out.println("Player 1: " + player1);
    System.out.println("Player 2: " + player2);

    // Random team generator within dialog box.
    Random r = new Random();
    String msg1 = player1 + ": " + teams.get(r.nextInt(teams.size()));
    String msg2 = player2 + ": " + teams.get(r.nextInt(teams.size()));
    Component frame = null;
    ImageIcon icon = new ImageIcon("icon2.png");
    JOptionPane.showMessageDialog(frame, msg1 + "\n" + msg2, "Fifa Team Picker", PLAIN_MESSAGE, icon);
}
}

您不能将单个 .jar 文件条目作为文件读取,因为它们不是单独的文件。它们只是指示压缩数据的字节子序列。这意味着您的扫描仪出现故障,并且您的 teams 集合为空,这反过来会导致 teams.get 抛出异常。

如果您在命令行上 运行 .jar 文件,您可以自己查看。这样的命令通常如下所示:java -jar myteamsproject.jar

作为您应用程序一部分的文件称为 资源。您必须使用 Class 的 getResource or getResourceAsStream 方法阅读它:

Scanner s = new Scanner(Main.class.getResourceAsStream("teams.txt"));

同样,您必须将资源作为 URL 传递给 ImageIcon,而不是文件名:

ImageIcon icon = new ImageIcon(Main.class.getResource("icon2.png"));

当然,除非 teams.txt 和 icon2.png 实际上在 .jar 文件中,否则上述行将不起作用。生成 .jar 文件后,您应该检查其内容并验证这些条目是否存在。