【问题标题】:Java: How do I start a standalone application from the current one when both are in the same package?Java:当两者都在同一个包中时,如何从当前应用程序启动一个独立的应用程序?
【发布时间】:2015-12-04 13:06:08
【问题描述】:

这看起来应该很容易,所以我肯定遗漏了一些明显的东西:我在同一个包中有 4 个独立应用程序,us.glenedwards.myPackage,

  • myClass1 扩展应用程序
  • myClass2 扩展应用程序

等等……

我需要每个类都充当自己的独立应用程序。然而,我希望能够通过单击链接从我所在的课程开始其他 3 个课程。 Android 允许我使用 Intents 做到这一点:

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

我尝试使用从 myClass1 启动 myClass2

myClass2.launch("");

但我得到一个错误,“应用程序启动不能被多次调用”。我可以让它工作的唯一方法是从 myClass2 中删除“扩展应用程序”和 start() 方法,这意味着 myClass2 不再是一个独立的应用程序。

如何从 myClass1 启动 myClass2、myClass3 或 myClass4,而这 4 个都是独立的应用程序?

【问题讨论】:

    标签: java javafx-8 app-startup


    【解决方案1】:

    您可以通过在 Application 子类之一的新实例上直接调用 start(...) 来完成这项工作,但这有点像 hack,并且与start(...) 方法的预期用途。 (只是在语义上:一个名为 Application 的类中的一个名为 start 的方法应该在您的应用程序启动时执行,而不是在它已经运行后的某个任意时间点执行。)

    您真的应该将start 方法视为传统Java 应用程序中main 方法的替代品。如果您有一个应用程序调用另一个应用程序的 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 只实例化一次这样的类才有意义,因此您应该认为这些本质上是不可重用的。将您想要重用的任何代码移动到某个不同的类中。

    【讨论】:

    • 这是经过深思熟虑和组织良好的。我可以从一个主要课程中完成我需要做的所有事情,但它正在变成一个超过 10,000 行的文件。由于主要的 4 或 5 个组件(类)中的每一个都可以独立使用而无需访问任何其他组件,因此我决定尝试将其编写为 4 或 5 个独立的独立应用程序,可以从一个父级随意访问类,希望将每个文件保持在 2,500 行或更少。我在开发中足够早,可以根据您的模板重写它。谢谢!
    【解决方案2】:

    你试过了吗?

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

    此外,根据需要处理/捕获异常。

    【讨论】:

    • :) 这也回答了我的另一个问题——如何启动外部程序/应用程序并捕获结果。谢谢!
    【解决方案3】:

    我是对的;这很简单。这就是我在 4 小时的睡眠中编写代码所得到的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 2019-08-01
      相关资源
      最近更新 更多