ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java:当两者都在同一个包中时,如何从当前应用程序启动独立应用程序?

2019-09-11 06:04:16  阅读:200  来源: 互联网

标签:app-startup java javafx-8


这似乎应该很容易,所以我必须忽略一些明显的东西:我在同一个包中有4个独立的应用程序,us.glenedwards.myPackage,

> myClass1扩展了Application
> myClass2扩展了Application

等等…

我需要每个类都作为自己的独立应用程序.然而,我希望能够通过单击链接启动我所在的其他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中删除“extends application”和start()方法,这意味着myClass2不再是一个独立的应用程序.

如何从myClass1启动myClass2,myClass3或myClass4,其中所有4个都是独立的应用程序?

解决方法:

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

您应该将start方法视为传统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一次实例化一个这样的类才有意义,所以你应该认为这些本身不是可重用的.将您想要重用的任何代码移动到某个不同的类中.

标签:app-startup,java,javafx-8
来源: https://codeday.me/bug/20190911/1803964.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有