2013-11-23 4 views
2

Я хочу реализовать функцию reset в моем приложении, которое очищает некоторые каталоги, копирует файлы и т. Д., Затем для завершения процесса мне нужно перезапустить его.Как заставить ваше приложение java перезагрузиться

Как сделать повторное применение приложения? Я думаю, что открытие второго экземпляра и закрытие этого будет достаточно, хотя это не настоящий перезапуск.

Ядро моего приложения является классом расширения JFrame, но есть много статических блоков, которые читают расширения класса при выполнении программы. Мне нужно перезапустить программно мое приложение, поэтому все статические коллекции и блоки будут созданы/выполнены снова.

Это начинается таким образом.

SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Window().createGUI(); 
     } 
    }); 

Это кажется отлично работает:

public void restart() { 
    /* dispose(); 
     Window.main(null);*/ 
      StringBuilder cmd = new StringBuilder(); 
      cmd.append(System.getProperty("java.home") + File.separator + "bin" + File.separator + "java "); 
      for (String jvmArg : ManagementFactory.getRuntimeMXBean().getInputArguments()) { 
       cmd.append(jvmArg + " "); 
      } 
      cmd.append("-cp ").append(ManagementFactory.getRuntimeMXBean().getClassPath()).append(" "); 
      cmd.append(Window.class.getName()).append(" "); 

      try { 
       Runtime.getRuntime().exec(cmd.toString()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.exit(0); 
    } 
+0

@DNA судимы не работает для меня. – Yoda

+4

Очень неполный, я боюсь, что ваш вопрос. Для нас это прояснить. Сильно. Да, хм. GUI, не так ли? Качели, не так ли? –

+1

Может ли это быть проблемой XY? http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Brandon

ответ

4

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

public void restart() { 
      StringBuilder cmd = new StringBuilder(); 
      cmd.append(System.getProperty("java.home") + File.separator + "bin" + File.separator + "java "); 
      for (String jvmArg : ManagementFactory.getRuntimeMXBean().getInputArguments()) { 
       cmd.append(jvmArg + " "); 
      } 
      cmd.append("-cp ").append(ManagementFactory.getRuntimeMXBean().getClassPath()).append(" "); 
      cmd.append(Window.class.getName()).append(" "); 

      try { 
       Runtime.getRuntime().exec(cmd.toString()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      System.exit(0); 
    } 

27/02/2018: Я считаю, что Марк отправил лучшее решение: https://stackoverflow.com/a/48992863/1123020

+2

не работает, просто закрывая приложение. – ralphgabb

+0

@ralphspoon Я пробовал этот подход несколько лет спустя, и он прекратил работать, но в то время я отправлял код, который он выполнял и выполнял правильно. Просто давайте знать. Возможно, это зависит от окружающей среды. Тем временем я изменил ОС. – Yoda

+0

Это скопирует JAVA_TOOL_OPTIONS, если установлено глобально. –

2

Ваш вопрос/мои комментарии:

Я хочу реализовать функцию сброса в моем приложении, который очищает некоторые каталоги, копирует файлы и т.д. то для завершения процесса мне нужно его перезапустить. Как выполнить повторные попытки приложения?

Это общая функция/потребность во многих приложениях, а не только академических заданиях. К сожалению, для этого не существует единого варианта, и все это будет зависеть от особенностей вашей программы. Если ваша программа очень модульная и написана с умным разделением проблем M-V-C, это становится намного проще сделать, часто просто перенастраивая модель в исходное состояние или загружая новую модель в графический интерфейс.

Я думаю, что открытие второго экземпляра и закрытие этого было бы достаточно, хотя это не настоящий перезапуск.

Я думаю, что это очень плохая идея. Лучше просто сбросить состояние текстовых компонентов, кнопок, флажков и т. Д. В исходное состояние. Опять же, чем более модульный ваш код, тем легче это делать. Каждый отдельный модуль может иметь свой собственный метод reset(), который позаботится о его инициализации.

В моем случае я хочу перезагрузить JFrame, состоящий из многих JPanels. Я сделал это:

Опять же, я настоятельно призываю вас не идти этим путем.

Вы можете разместить некоторые из ваших JTextComponents в ArrayList для удобства сброса. Например, вы можете сбросить свои поля GUI внутри сброса. Что-то вроде:

public void reset() { 
    // assuming you have an ArrayList of JTextComponents called textComponents 
    for (JTextComponent textComponent : textComponents) { 
    textComponent.setText(""); 
    } 

    // same if you had a bunch of comboboxes in a List called comboBoxes 
    for (JComboBox comboBox : comboBoxes) { 
    comboBox.setSelection(-1); // consider removing listeners first, then re-adding them 

    // etc for other components 
    } 
} 

Редактировать

я узнал, что мое решение -> утилизации JFrame не так хорошо. У меня много статических блоков, загрузка сериализованных файлов и т. Д. Мне нужно перезапустить его. Возможно, есть простой способ выполнения приложения.

Извините, но это только говорит мне о том, что ваша программа, возможно, улучшила свою организацию. Он должен быть сброшен, и если нет, подумайте об изменении его, чтобы это было так. Соответствует ли она структуре Model-View-Control? Если нет, подумайте об этом.

+0

Я узнал, что мое решение -> утилизация JFrame не так хороша. У меня много статических блоков, загрузка сериализованных файлов и т. Д. Мне нужно перезапустить его. Возможно, есть простой способ выполнения приложения. – Yoda

+0

@Yoda: см. Редактирование для ответа. –

+1

@Yoda Перезапуск Java-процесса изнутри, вероятно, будет сложным. Вам нужно подумать о путях классов, точной командной строке, системных свойствах, кто знает, что еще. Судно на воздушной подушке является правильным. Простейшим/самым надежным решением является создание объектов состояния приложения для сброса, чтобы вы могли его сбросить. – Brandon

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