java – 是否可以在不重新读取的情况下多次添加从FXML文件加载的组件?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 是否可以在不重新读取的情况下多次添加从FXML文件加载的组件?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1978字,纯文字阅读大概需要3分钟。
内容图文
![java – 是否可以在不重新读取的情况下多次添加从FXML文件加载的组件?](/upload/InfoBanner/zyjiaocheng/787/e8c8acac81fc4a4eb9bb5b6a9aab6120.jpg)
所以我开始使用javafx,我想知道以下内容:
假设我有一个带有一些容器的应用程序.
例如:
VBox vBox = new VBox();
我还有一个FXML文件,其中包含我想多次添加到vBox的其他组件.
现在我可以这样做:
for(int i = 0; i < 8; i++) {
vBox.getChildren().add(FXMLLoader.load(getClass().getResource("/someComponent.fxml")));
}
但这对我来说似乎效率很低,因为每次添加组件时,它都会从文件中重新读取.
有没有办法构建一个只读取一次文件的FXMLLoader,以某种方式保存它,并让我生成文件中定义的组件的新实例?
解决方法:
没有内置的方法来做到这一点. Tom Schindl正在开发一个项目到convert FXML to java source并在构建时编译源代码.我不知道该项目的当前状态是什么(我提供的链接有下载,但他说功能不完整).
对于桌面应用程序,这不太可能是一个问题;在最坏的情况下(在绝大多数用例中),它只会在启动时或响应用户输入(在后一种情况下不常见)时完成.所以这可能不是问题.
话虽如此,这是一个缓慢的过程.性能有两个不同的问题:一个是读取文件(或其他资源);第二个是解析fxml(使用大量的反射).
如果执行此操作确实存在性能问题,则只需将重复加载的组件从fxml移动到Java即可.
如果访问资源是瓶颈(除非你有充分的证据表明这是一个问题,否则我真的不会这样做;我认为除非你从远程位置加载FXML,否则这不太可能是性能问题的原因),并且你想将它保存在FXML中,你可以将FXML加载到内存中,让FXMLLoader从ByteArrayInputStream中读取:
URL fxmlResource = getClass().getResource("/SomeComponent.fxml") ;
InputStream inputStream = fxmlResource.openStream();
byte[] buffer = new byte[8192];
int totalBytes = 0 ;
int bytesRead ;
while((bytesRead = inputStream.read(buffer, totalBytes, buffer.length - totalBytes)) != -1) {
totalBytes += bytesRead ;
if (totalBytes == buffer.length) {
byte[] newBuffer = new byte[2 * buffer.length];
System.arraycopy(buffer, 0, newBuffer, 0, buffer.length);
buffer = newBuffer ;
}
}
inputStream.close();
byte[] content = new byte[totalBytes];
System.arraycopy(buffer, 0, content, 0, totalBytes);
InputStream fxml = new ByteArrayInputStream(content);
VBox vbox = new VBox(5);
for(int i = 0; i < 8; i++) {
FXMLLoader loader = new FXMLLoader();
fxml.reset();
vBox.getChildren().add(loader.load(fxml));
}
内容总结
以上是互联网集市为您收集整理的java – 是否可以在不重新读取的情况下多次添加从FXML文件加载的组件?全部内容,希望文章能够帮你解决java – 是否可以在不重新读取的情况下多次添加从FXML文件加载的组件?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。