2015-09-08 4 views
1

Это кажется, что это должно быть легко, так что я должен быть отсутствующий что-то очевидное: у меня есть 4 автономные приложения в одном пакете, us.glenedwards.myPackage,Java: Как запустить автономное приложение из текущего, когда оба находятся в одном пакете?

  • MyClass1 распространяется Применение
  • myClass2 расширяет приложение

и т.д ...

мне нужно каждый класс действовать как свое собственное отдельное приложение. Тем не менее я хочу, чтобы иметь возможность запускать другие 3 класса из той, в которой я нахожусь, нажав на ссылку. Android позволяет мне сделать это с помощью Намерения:

Intent intent = new Intent(this, EditData.class); 
overridePendingTransition(R.layout.edit_data_scrollview, R.layout.state); 
startActivity(intent); 

Я пытался, начиная с myClass2 MyClass1 использованием

myClass2.launch("");

Но я получаю ошибку «Запуск приложения не должен быть вызван более чем один раз ». Единственный способ заставить его работать, если я удаляю как «extends application», так и метод start() из myClass2, что означает, что myClass2 больше не является автономным приложением.

Как я могу запустить myClass2, myClass3 или myClass4 из myClass1, причем все 4 из них являются автономными приложениями?

ответ

0

Вы пробовали это?

Runtime.getRuntime().exec("myClass1 [args]"); //put all args as you used in command 

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

+0

:) Ответ на другой вопрос, который у меня был, также - как запустить внешнюю программу/приложение и зафиксировать результаты. Благодаря! – VikingGlen

0

Я был прав; это было нелегко. Это то, что я получаю для написания кода на 4 часа сна:

myClass2 class2 = new myClass2(); 
try { 
class2.start(stage); 
} catch (Exception e) { e.printStackTrace(); } } 
4

Вы можете сделать эту работу, вызвав start(...) непосредственно на новый экземпляр одного из Application подклассов, но это вроде чувствует себя немного взлома и противоречит предполагаемому использованию метода start(...). (Только семантический: метод, называемый start в классе под названием Application должна выполняться при запуске вашего приложения, а не в какой-то произвольной точке после того, как она уже работает.)

Вы должны действительно думать о методе start в качестве замены для main в традиционном приложении Java. Если у вас было одно приложение, вызывающее метод main другого приложения, вы бы (надеюсь) пришли к выводу, что у вас были структурированные вещи неправильно.

Так что я бы рекомендовал рефакторинга ваш дизайн так что ваши отдельные компоненты не являются приложения подклассы, а просто старые регулярные занятия:

public class FirstModule { 

    // can be any Parent subclass: 
    private BorderPane view ; 

    public FirstModule() { 

     // create view; you could also just load some FXML if you use FXML 
     view = new BorderPane(); 

     // configure view, populate with controls, etc... 

    } 

    public Parent getView() { 
     return view ; 
    } 

    // other methods as needed... 
} 

и, аналогично,

public class SecondModule { 

    private GridPane view ; 

    public SecondModule { 

     view = new GridPane(); 
     // etc etc 
    } 

    public Parent getView() { 
     return view ; 
    } 
} 

Теперь вы можете просто делайте такие вещи, как

FirstModule firstModule = new FirstModule(); 
Scene scene = new Scene(firstModule.getView()); 
Stage stage = new Stage(); 
stage.setScene(scene); 
stage.show(); 

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

public class FirstApplication extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Scene scene = new Scene(new FirstModule().getView()); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

или вы можете создать экземпляр их как часть большего применения:

public class CompositeModule { 

    private HBox view ; 

    public CompositeModule() { 

     Button first = new Button("First Module"); 
     first.setOnAction(e -> { 
      Parent view = new FirstModule().getView(); 
      Scene scene = new Scene(view); 
      Stage stage = new Stage(); 
      stage.initOwner(first.getScene().getWindow()); 
      stage.setScene(scene); 
      stage.show(); 
     }); 

     Button second = new Button("Second Module"); 
     second.setOnAction(e -> { 
      Parent view = new SecondModule().getView(); 
      Scene scene = new Scene(view); 
      Stage stage = new Stage(); 
      stage.initOwner(second.getScene().getWindow()); 
      stage.setScene(scene); 
      stage.show(); 
     }); 

     HBox view = new HBox(10, first, second); 
     view.setAlignment(Pos.CENTER); 

    } 

    public Parent getView() { 
     return view ; 
    } 
} 

и

public class CompositeApplication extends Application { 
    @Override 
    public void start(Stage primaryStage) { 

     Scene scene = new Scene(new CompositeModule().getView(), 360, 150); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

так, как я думаю, что это заключается в том, что подклассы Application представляют собой полностью запущенное приложение. Следовательно, имеет смысл только когда-либо создавать один такой класс один раз на JVM, поэтому вы должны считать, что они по своей сути не подлежат повторному использованию. Переместите любой код, который вы хотите повторно использовать в другом классе.

+0

Это было хорошо продумано и хорошо организовано. Я могу сделать все, что мне нужно сделать из одного основного класса, но он превращается в 10 000 + файл строки. Поскольку каждый из основных 4 или 5 компонентов (классов) может использоваться независимо без необходимости доступа к любому из других, я решил попытаться записать его как 4 или 5 отдельных автономных приложений, к которым можно получить доступ по желанию от одного родителя класс, надеюсь, сохраняя каждый файл до 2500 строк или меньше. Я достаточно рано в разработке, чтобы переписать его в соответствии с вашим шаблоном. Благодаря! – VikingGlen