【发布时间】:2015-05-05 22:27:41
【问题描述】:
在对标题感到沮丧之前,我想澄清一下我是 JavaFX UI 的新手。我作为一名开发人员已经 9 年了,使用 Swing,目前我决定尝试使用 JavaFX。网上的例子表明,与 Swing 相比,JavaFX 确实可以创建漂亮的 GUI。也许我试图以错误的方式创建和部署 GUI,但有一件事是肯定的。 JavaFX 窗格的加载速度比 Swing 慢,并且消耗更多的内存。使用 JAVAFX 重新设计了相同的 GUI,它需要将近 200Mb,而 Swing GUI 只需要 50Mb。
这里我给出一个代码示例,说明如何使用 FXML 以编程方式创建 GUI。
public class PanelCreator {
private FXMLPane<LoginPaneController> loginFXML;
private FXMLPane<RegistrationPaneController> registerFXML;
private FXMLPane<EmailValidationPaneController> emailValidationFXML;
public PanelCreator() {
this.rootPane = rootPane;
try {
loginFXML = new FXMLPane<LoginPaneController>("Login.fxml");
registerFXML = new FXMLPane<RegistrationPaneController>("Register.fxml");
emailValidationFXML = new FXMLPane<EmailValidationPaneController>("EmailValidation.fxml");
} catch (IOException e) {e.printStackTrace();} // catch
} // Constructor Method
public Pane getLoginPane() {
return loginFXML.getPane();
} // getLoginPane()
public Pane getRegisterPane() {
return registerFXML.getPane();
} // getRegisterPane
public Pane getEmailValidationPane() {
return emailValidationFXML.getPane();
} // getEmailValidationPane
public LoginPaneController getLoginPaneController() {
return loginFXML.getController();
} // getLoginPaneController()
public RegistrationPaneController getRegistrationPaneController() {
return registerFXML.getController();
} // getRegistrationPaneController()
} // class PanelCreator
PanelCreator 的构造方法创建了 3 个 FXMLPane 类,一个结合了 FXML Pane 和它的 Controller 的类。 FXMLPane 类的代码如下所示。
public class FXMLPane<T> {
private Pane pane;
private T paneController;
public FXMLPane(String url) throws IOException {
URL location = getClass().getResource(url);
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(location);
fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
pane = fxmlLoader.load(location.openStream());
paneController = fxmlLoader.<T>getController();
} // Constructor Method
public Pane getPane() {
return pane;
} // getPane()
public T getController() {
return paneController;
} // getController()
}
现在通过 PanelCreator,我可以使用 get 方法来获取每个 JavaFX 面板及其控制器,而且我不必每次都运行 FXML 加载方法来获取面板。目前,困扰我的不是 FXML GUI 的创建比 Swing 慢,而是 RAM 是相应 Swing 版本的 3 倍和 4 倍。
有人可以向我解释我做错了什么吗? FXML 文件在网格窗格上只有基本组件,如按钮、图层和文本字段等组件。
上面例子的代码可以找到here
【问题讨论】:
-
你检查过堆真的被消耗了吗?如果 Java 有时需要它,它会消耗本机内存,但从不将其返回给操作系统(因为从性能的角度来看它更好)。那么您是否尝试打印还剩多少堆?
-
是的,我明白你的意思了。在我的 PC 上使用 Java 8u40,Swing 版本使用大约 30MB,FX 使用大约 70MB。看起来 FX 是一个更重的工具包。十年前这也会让我担心,但今天即使是拥有 GB RAM 的手机也不应该成为问题,我认为?还要考虑到 FX 具有 Swing 所没有的特性/能力,这会使它变得更重。
-
@jewelsea 有什么建议吗?
-
@tomsontom 有什么建议吗?
-
我运行您的应用程序,将最大堆内存大小限制为允许应用程序启动的最小大小 - 在 OS X Java 8u40 上,对于 Swing 程序,这是 4Mb
java -Xmx4m,对于 JavaFX程序,这是 8Mbjava -Xmx8m。因此,Swing 和 JavaFX 程序都能够以相当小的 Java 堆空间使用量运行。
标签: performance user-interface memory javafx javafx-8