将引用传递给javafx.application.Application

将引用传递给javafx.application.Application,第1张

引用传递给javafx.application.Application

我将尝试演示在Java程序和Java-fx程序之间传递引用的一些不同方法
我希望它能对将来有类似需求的读者有所帮助。我也希望它可以通过其他解决方案鼓励其他答案。
发布的代码不应被视为正确的实现,而应是旨在阐明不同方法的简短代码。为此,我将介绍一个简单的侦听界面:

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
在两个应用程序之间共享引用(在这种情况下为实例的引用)?

方法1:将

start()
方法视为应用程序的入口点(请参阅James_D
Answer)
如果您想将现有的Java应用程序与java-fx绑定并使用java-fx
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:使用JavaFX 9 Platform#startup
当您 不能 将该

Application#start
方法用作应用程序的入口点时,这是我发现的最佳解决方案。
如fabians 答案所示,从java-fx
9开始,您无需扩展即可启动
Application
。您所要做的就是修改
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     }}

方法3:使用静态成员
例如,在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();    }}

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

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;    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5506328.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存