JOptionPanel.showMessageDialog не отображается, когда программа запускается через файл .jar - PullRequest
0 голосов
/ 06 ноября 2018

Я немного искал ответ на свой вопрос, но не нашел ничего, что соответствовало бы моему, может быть, я не достаточно усердно искал, но я новичок в этом сайте.

Поэтому я использую 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);
}
}

1 Ответ

0 голосов
/ 06 ноября 2018

Вы не можете читать отдельные записи файла .jar как файлы, потому что они не являются отдельными файлами. Это просто подпоследовательность байтов, указывающих сжатые данные. Это означает, что ваш сканер выходит из строя, а ваша коллекция teams пуста, что, в свою очередь, вызывает teams.get исключение.

Если вы запустите файл .jar в командной строке, вы можете убедиться в этом сами. Такая команда обычно выглядит так: java -jar myteamsproject.jar

Файл, который является частью вашего приложения, называется ресурсом. Вы должны прочитать его с помощью getResource или 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 собран, вы должны проверить его содержимое и убедиться, что эти записи присутствуют.

...