2013-06-15 3 views
5

Я хочу закрыть и перезапустить уже запущенное приложение (автоматически), которое я создаю, нажав кнопку или что-то в этом роде, я хочу сделать это с целью повторного запуска приложения на другом языке, я новичок в JavaFx и Java в целом, пожалуйста, можете ли вы дать мне решение этой проблемы?Перезапустить приложение в JavaFx

+1

Да, ваш вопрос об этом. Но почему вам нужно перезапустить приложение, чтобы изменить язык? Может быть, его можно изменить без повторного запуска? Какова языковая конфигурация вашего приложения? –

+0

Ну, я мало знаю об этих механизмах, я хочу перезапустить приложение, чтобы переопределить все объекты/элементы управления на другом языке. – AymenDaoudi

+0

Проверьте решение @ UlukBiy на [JavaFX 2 и интернационализацию] (http://stackoverflow.com/questions/10143392/javafx-2-and-internationalization). – tarrsalah

ответ

7

Этот вопрос не имеет деталей. Вы упоминали приложение JavaFX, но важно знать, как развертывается это приложение. Работает ли он в веб-браузере, как приложение Java-webstart, автономная банка или автономное собственное приложение? С чего начать приложение? Ответ на эти вопросы облегчит ответ на ваш вопрос со спецификой.

Хотя следующий пример не является JavaFX, используемый здесь подход будет работать для некоторых способов развертывания приложения JavaFX. Один из способов перезапуска приложения, который хорошо работает, - это запустить приложение из сценария. Внутри скрипта будет цикл while, который постоянно перезапускает программу на основе кода выхода программы. Вот пример для сценария оболочки Баша, который начинается IntelliJ на платформе Linux:

while true ; do 
    eval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 $MAIN_CLASS_NAME $* 
    test $? -ne 88 && break 
done 

В этом примере сценарий запуска проходит «jb.restart.code» в качестве параметра приложения. Если IntelliJ хочет перезапустить, он вернет это значение 88 в качестве кода выхода. Сценарий проверяет код выхода приложения и перезапускает приложение, если значение равно 88.

Этот подход хорошо работает на большинстве платформ, но требует, чтобы приложение запускалось через скрипт.

+0

Как насчет собственного автономного приложения? –

+0

Если это собственное автономное приложение, то какая ОС является родной?Эти детали влияют на ответ. – axiopisty

+0

В настоящее время я реализовал решение Windows с помощью exec, за которым следует System.exit(). Я думаю, что Linux и MacOS будут следовать одному и тому же пути с относительными командами оболочки. –

2

Одним из решений является передача командной строки и рабочего каталога в стартовом скрипте на ваш основной() метод. Используя ProcessBuilder, вы можете перезапустить приложение. Другая возможность заключается в том, чтобы запустить все приложение в пользовательском загрузчике классов (например, проект Spring имеет подходящие загрузчики классов в исходной базе), затем вы можете в принципе перезапустить, запустив свой основной в другом загрузчике классов, однако затем вам необходимо надлежащее обслуживание для бесплатных потоков и ресурсов первый экземпляр.

+0

Ну, я на самом деле очень новичок в этом, и я немного смущен и не получая ответа, можете ли вы, пожалуйста, показать мне какой-то код, который может помочь или обратиться к статье, объясняющей это, thx – AymenDaoudi

+0

Ну, действительно, Classloader thingy довольно сложный, лучше попробуйте подход командной строки. Вы можете начать процесс ОС с Java, поэтому вам нужно знать, где находится исполняемый файл java, и как устанавливается путь к классам. Вы можете найти про путь к классу, используя System.getProperty («java.class.path») или аналогичный. Расположение java.exe, вы должны перейти к вашему приложению во время запуска. Использование Runtime.getRuntime(). Exec (..) или просто ProcessBuilder позволит вам начать полную копию вашего приложения. –

+0

Я попробую это и посмотрю, THX для вашей помощи – AymenDaoudi

1
retstart.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent t) { 
      if(getOnCloseRequest()!=null){ 
       getOnCloseRequest().handle(new WindowEvent(getScene().getWindow(), WindowEvent.WINDOW_CLOSE_REQUEST)); 
//write code to invoke application instance again 
      }else{ 
       close(); 
      } 

     } 
    }); 
Смежные вопросы