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 文件后,您应该检查其内容并验证这些条目是否存在。
我稍微搜索了一下我的问题的答案,但没有找到与我的答案完全匹配的内容,也许我搜索不够努力,但我是这个网站的新手。
所以我使用 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 文件后,您应该检查其内容并验证这些条目是否存在。