代码之家  ›  专栏  ›  技术社区  ›  c0der

传递对javafx.application.application的引用

  •  0
  • c0der  · 技术社区  · 7 年前

    考虑一个不存在的应用程序,我们称之为 Business .

    业务 Model 对象,从而公开一些属性。 也接受这些属性的侦听器。

    添加 javafxgui应用程序。这个 GuiApp 明显地延伸 javafx.application.Application 需要一个参考号 模型

    正在搜索将非字符串参数传递给 圭亚普

    • 业务 初始化对的静态引用 模型 在里面 圭亚普 here .

    • javafx9方法:如所示 here 您可以启动JavaFx应用程序而无需扩展 Application

    • 更改工作流方法:将现有工作流更改为 圭亚普 初始化 BusinessApp . 可以看到这样的工作流的一个例子 here

    还有其他可行的方法吗?最佳实践?

    1 回复  |  直到 7 年前
        1
  •  1
  •   c0der    7 年前

    我将尝试演示在java程序和javafx程序之间传递引用的一些不同方法。
    我把它贴出来,希望它能帮助将来有类似需求的读者。我也希望它可以鼓励其他答案与其他解决办法。

    interface Observe{ void update(int i); }
    

    一个java类,表示一个正在退出的业务应用程序:

    public class JavaApp {
    
        private Observe observer;  private int counter = 0;
    
        JavaApp(Observe observer){  //not null safe
            this.observer = observer;
        }
    
        void process() {            
            new Timer().scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    observer.update(counter >=100 ? 0 : ++counter);
                }
            }, 1000,1000);
        }
    }
    

    一个java fx应用程序,应该添加到现有的业务应用程序中,聆听它并充当视图:

    public class JavaFxApp extends Application implements Observe{
    
        private Label label;
    
        @Override public void start(Stage stage) {
            label = new Label("waiting");
            BorderPane pane = new BorderPane(label);
            Scene scene = new Scene(pane, 100, 100);
            stage.setScene(scene);
            stage.show();
        }
    
        @Override public void update(int i) {
            Platform.runLater(()-> label.setText(String.valueOf(i)));
        }
    }
    

    我们如何共享一个引用,在本例中是对 Observe 实例,在两个应用程序之间?

    start() 方法作为应用程序的入口点 (见James D answer
    如果您想将现有的java应用程序与javafx绑定并使用javafx,这是简单而直接的 Application

    public class JavaFxApp extends Application implements Observe{
    
        private Label label;
    
        @Override public void start(Stage stage) {  
            JavaApp main = new JavaApp(this);
            label = new Label("waiting");
            BorderPane pane = new BorderPane(label);
            Scene scene = new Scene(pane, 100, 100);
            stage.setScene(scene);
            stage.show();
    
            new Thread(()-> { main.process();}).start(); //launch the business process
        }
    
        @Override   public void update(int i) {
            Platform.runLater(()-> label.setText(String.valueOf(i)));
        }
    
        public static void main(String[] args) { launch();  }
    }
    


    方法2:使用JavaFX9平台启动
    这是我找到的最好的解决办法,当你 不能 Application#start
    如费比安所示 answer 应用 . 你所要做的就是修改 main java应用程序的名称:

    public class JavaApp {
    
        private Observe observer;  private int counter = 0;
    
        JavaApp(Observe observer){//not null safe
            this.observer = observer;
        }
    
        void process() {
            new Timer().scheduleAtFixedRate(new TimerTask() {
                @Override   public void run() {
                    observer.update(counter >=100 ? 0 : ++counter);
                }
            }, 1000,1000);
        }
    
        public static void main(String[] args) {
            JavaFxApp view = new JavaFxApp(); //initialize JavaFx application
            JavaApp main = new JavaApp(view);
    
            Platform.startup(() -> {//launch JavaFx application 
    
                Stage stage = new Stage();
                try {
                    view.start(stage);
                } catch (Exception ex) {ex.printStackTrace();}
            });
    
            main.process(); //run business process 
        }
    }
    



    例如,在java fx应用程序中引入静态getter:

    public class JavaFxApp extends Application {
    
        private static Label label = new Label("waiting");
    
        @Override public void start(Stage stage) {  
            BorderPane pane = new BorderPane(label);
            Scene scene = new Scene(pane, 100, 100);
            stage.setScene(scene);
            stage.show();
        }
    
        static Observe getObserver() {
            return JavaFxApp::update;
        }
    
        private static void update(int i) {
            Platform.runLater(()-> label.setText(String.valueOf(i)));
        }
    }
    

    并在java应用程序中使用它:

    public class JavaApp {
    
        private Observe observer;  private int counter = 0;
    
        JavaApp(Observe observer){//not null safe
            this.observer = observer;
        }
    
        void process() {
            new Timer().scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    observer.update(counter >=100 ? 0 : ++counter);
                }
            }, 1000,1000);
        }
    
        public static void main(String[] args){
            new Thread(()-> Application.launch(JavaFxApp.class)).start();
            Observe observer = JavaFxApp.getObserver(); //get static observer reference
            JavaApp main = new JavaApp(observer);
            main.process();
        }
    }
    

    获取静态引用的更好方法可能是(基于 this 回答):

    public class JavaFxApp extends Application implements Observe{
    
        private static final CountDownLatch latch = new CountDownLatch(1);
        private static Observe observer = null;
        private Label label;
    
       @Override public void init() {
           observer = this;
           latch.countDown();
        }
    
        @Override public void start(Stage stage){
            label = new Label("waiting");
            BorderPane pane = new BorderPane(label);
            Scene scene = new Scene(pane, 100, 100);
            stage.setScene(scene);
            stage.show();
        }
    
        @Override public void update(int i) {
            Platform.runLater(()-> label.setText(String.valueOf(i)));
        }
    
        static Observe getObserver() {
            try {
                latch.await();
            } catch (InterruptedException e) { e.printStackTrace();  }
    
            return observer;
        }
    }
    
    推荐文章