在JavaFX应用程序中,必须对javafx.application.Application进行子类化,并且必须从该派生类中调用继承的launch()方法(尽管它是公共的),否则将引发异常。然后,launch()方法使用反射来实例化派生的类,从而很难为类成员设置值,而又不会在启动时丢失它们。这一切对我来说似乎完全不寻常,我想知道为什么启动JavaFX应用程序如此复杂,如果这种软件设计(设计模式?)有名称,或者仅仅是不好的设计?
编辑:
更具体地说,我想使用观察者模式,以便在加载文档时通知我的java应用程序,如下所示:
public class MyDocumentLoader extends Application { private ChangeListener<Worker.State> changeListener; public void setChangeListener(ChangeListener<Worker.State> changeListener) { this.changeListener = changeListener; } ... public void loadDocument(String url) { webEngine.getLoadWorker().stateProperty().addListener(changeListener); webEngine.load(url); } ... }
我需要几种方法中的回调成员,理想情况下,我可以拥有一个以上类来加载文档的实例,因此可以为不同的URL设置不同的ChangeListeners。
JavaFX支持大量的部署和打包策略。https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/toc.html,并且具有标准化的生命周期入口和出口点可简化对所有这些策略的支持。
如果由于JavaFX启动程序实例化了主应用程序类而在努力初始化它,那么最好的选择是使用James.D指出的Application.init()和Application.stop()方法。