2016-01-14 6 views
0

В некоторых случаях моя программа не будет закрывать указанный кадр. По какой-то причине он отлично закрывается при запуске IntelliJ с помощью команды run, но после компиляции в банку и упаковки с помощью Launch4J он застревает, когда я пытаюсь закрыть его программно. Здесь применяется код:JFrame.dispose не закрывающая рама

Classic.java

import javax.swing.*; 
import java.io.FileNotFoundException; 
import java.io.PrintStream; 
import java.util.*; 
import java.text.SimpleDateFormat; 
import static javax.swing.SwingUtilities.invokeLater; 
public class Classic extends Game{ 
    private static JFrame gui; 
... 
    //Starts game and opens gui 
    public void play() { 
     invokeLater(Classic::startGUI); 
     //startGUI() intiates gui correctly, let me know if you need it 
     new Thread(Classic::startGame).start(); 
    } 
... 
    public static void startGame() { 
     //Program works fine until closing window; 
     //Game methods and code omitted 
     print("Thank you for playing!" + System.lineSeparator() + "Press enter to exit."); 
     boolean end = false; 
     while (!end) { 
      //isInputReady() checks if user pressed enter 
      end = newContentPane.isInputReady(); 
     } 
     gui.dispose(); 
    } 
} 

Я не уверен, если это код ошибки или ошибки с Launch4J, так как это происходит только в Launch4J скомпилирован версии (не через IntelliJ или через java.exe -jar).

EDIT: Я также попытался убить поток GUI с помощью thread.interrupt(), но это не изменило результат.

+0

... Я думал, что он закрывается после того, как код достигает конца метода. У меня нет явной нити ближе. – greatmastermario

ответ

0

Вы можете попробовать gui.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); (установить этот параметр после создания объекта GUI)

Обычно JVM закрывается после каждого без Deamon нити достигает своей цели. Swing создает собственный поток для обработки событий (EDT). Я предполагаю, что в вашем приложении в некоторых случаях поток non-deamon все еще работает, что предотвращает закрытие JVM.

Вы можете найти дополнительную информацию в этой теме: JFrame.dispose() vs System.exit()

+0

Причина, по которой я использовал JFrame.dispose(), заключалась в том, чтобы закрыть окно. Код игры выше запускается через отдельное меню, но я не хочу, чтобы меню закрывалось в конце игры. Также, как указано выше, он отлично работает при запуске IntelliJ или Jar, но компиляция с Launch4J вызывает проблему. – greatmastermario

+0

Факт остается фактом: после того, как вы хотите закрыть приложение, поток все еще работает, поэтому вам нужно только указать параметр: для выхода VM с помощью System.exit(), которая не так велика или проверяет, какие потоки все еще запущены , Используйте Thread-API для доступа ко всем потокам и распечатайте их на консоли. Затем вы видите отличие от IDE от Launch4j. – morpheus05

+0

Когда я ищу тему, я смотрю в потоках JVM или где-то еще? Он не должен иметь ничего общего с JVM, поскольку он имеет правильное поведение в IntelliJ и как Jar. Launch4J не является частью программы, а просто оболочкой для запуска ее как исполняемого файла Windows. В этом случае у него есть отдельная обработка потоков из JVM? Кроме того, я не пытаюсь закрыть всю программу, просто окно. Игра (показано выше) открывается в отдельном окне из опций, которые остаются открытыми, поэтому вы можете начать новую игру после того, как закончите. – greatmastermario

 Смежные вопросы

  • Нет связанных вопросов^_^