使用FXML的JavaFX UI控件架构(控件外观)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用FXML的JavaFX UI控件架构(控件外观),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1840字,纯文字阅读大概需要3分钟。
内容图文
![使用FXML的JavaFX UI控件架构(控件外观)](/upload/InfoBanner/zyjiaocheng/794/29c4456bb8834d68980932a7e07600a3.jpg)
在JavaFX8中,有一个UI Controls Architecture用于make自定义控件.基本上是基于:
>控制.
>皮肤.
> CSS.
此外,还有一个用于制作GUI的basic structure of an FXML project.基本上:
>控制.
> FXML文件.
> CSS.
我想将FXML与UI Controls Architecture一起使用,所以我的问题是:
谁是FXML文件的控制器?皮肤?
我必须做下面的代码吗?:
public class MySkin extends SkinBase<MyControl> {
public GaugeSkin(MyControl control) {
super(control);
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MyView.fxml"));
fxmlLoader.setRoot(control);
fxmlLoader.setController(control);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
解决方法:
我认为你是在正确的轨道上,Skin类是加载的FXML文件的控制器,因为它是负责定义构成特定控件的“外观”的节点的Skin.
Control类本身应该只定义保存控件状态的属性,而不应该关心Skin如何实际创建视图层次结构(也就是说,它应该只关心它的状态,而不是它的外观).
我要做的一个区别是改变fxmlloader.setController(control);到fxmlloader.setController(this);这样Skin类就成了控制器而不是控件本身.
您可以做的另一件事是将FXMLLoader逻辑移动到基类中,这样您每次要创建Skin时都不必复制它,如下所示:
public abstract class FXMLSkin<C extends Control> extends SkinBase<C>{
public FXMLSkin(C control) {
super(control);
this.load();
}
private void load() {
FXMLLoader loader = new FXMLLoader(getFXML());
loader.setController(this);
try {
Node root = loader.load();
this.getChildren().add(root);
} catch (IOException ex) {
Logger.getLogger(FXMLSkin.class.getName()).log(Level.SEVERE, null, ex);
}
}
protected abstract URL getFXML();
}
我有一个JavaFX UserControl on my Github页面,它与上面的FXMLSkinBase类非常相似.它使用约定来加载与派生类同名的FXML文件,以便每次都不需要指定FXML文件名. I.E.如果派生的皮肤被称为FooControlSkin,控件将自动加载名为FooControlSkin.fxml的FXML文件.
该类非常简单,代码可以很容易地重构为一个满足您要求的功能齐全的FXMLSkinBase类.
内容总结
以上是互联网集市为您收集整理的使用FXML的JavaFX UI控件架构(控件外观)全部内容,希望文章能够帮你解决使用FXML的JavaFX UI控件架构(控件外观)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。