理念

利用JavafX / FXML的声明性设计模式,并允许用户仅通过使用例如SceneBuilder打开某个视图即可重新定制布局或添加新控件,甚至根据用户需要更改样式,从而无需任何编码即可自定义某个视图。

FXML文件+ CSS基本上可以放置在通过URL可以到达的任何地方。 用户必须只知道FXML内部分配的控制器类的接口/方法。

遥控器

假设此简单的演示控制器类提供了用于远程控制设备和发送MQTT消息的方法,则用户可以自定义自己的遥控器。

public class RemoteController{@FXMLpublic void onTest(){Alert alert = new Alert(Alert.AlertType.INFORMATION);alert.setContentText("");alert.setHeaderText("WORKS!");alert.show();}public void onTest(String value){Alert alert = new Alert(Alert.AlertType.INFORMATION);alert.setHeaderText("WORKS!");alert.setContentText(value);alert.show();}public void onSwitch(String houseCode, int groudId, int deviceId, String command){Alert alert = new Alert(Alert.AlertType.INFORMATION);alert.setHeaderText("Switch!");alert.setContentText(String.format("Command: send %s %d %d %s", houseCode, groudId, deviceId, command));alert.show();}
}

remote.fxml和remote.css

请注意引用的de.jensd.shichimifx.demo.ext.RemoteControllerremote.css

因此,基本上可以通过以下方式调用控制器动作:

onAction="#onTest".

不错:

如果添加:

<?language javascript?>

到FXML,也可以通过controller -instance通过JavaScript调用传递参数。

onAction=controller.onTest('OFF')
onAction=controller.onSwitch('a',1,1,'ON')

不幸的是,除了-> this ,我找不到更多关于此功能的文档,但是以某种方式它神奇地起作用了;-)。 甚至可以传递不同类型的参数。

<?xml version="1.0" encoding="UTF-8"?><?language javascript?>
<?import javafx.geometry.*?>
<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?><VBox alignment="TOP_CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" styleClass="main-pane" stylesheets="@remote.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.jensd.shichimifx.demo.ext.RemoteController"><children><Label styleClass="title-label" text="Universal Remote" /><HBox alignment="CENTER_RIGHT" spacing="20.0"><children><Label layoutX="228.0" layoutY="96.0" styleClass="sub-title-label" text="Light Frontdoor" /><Button layoutX="43.0" layoutY="86.0" mnemonicParsing="false" onAction="#onTest" prefWidth="150.0" styleClass="button-on" text="ON" /><Button layoutX="411.0" layoutY="86.0" mnemonicParsing="false" onAction="#onTest" prefWidth="150.0" styleClass="button-off" text="OFF" /></children><padding><Insets left="10.0" right="10.0" /></padding></HBox><HBox alignment="CENTER_RIGHT" spacing="20.0"><children><Label layoutX="228.0" layoutY="96.0" styleClass="sub-title-label" text="Light Garden" /><Button layoutX="43.0" layoutY="86.0" mnemonicParsing="false" onAction="controller.onTest('ON')" prefWidth="150.0" styleClass="button-on" text="ON" /><Button layoutX="411.0" layoutY="86.0" mnemonicParsing="false" onAction="controller.onTest('OFF')" prefWidth="150.0" styleClass="button-off" text="OFF" /></children><padding><Insets left="10.0" right="10.0" /></padding></HBox><HBox alignment="CENTER_RIGHT" spacing="20.0"><children><Label layoutX="228.0" layoutY="96.0" styleClass="sub-title-label" text="Light Garden" /><Button layoutX="43.0" layoutY="86.0" mnemonicParsing="false" onAction="controller.onSwitch('a', 1,1,'ON')" prefWidth="150.0" styleClass="button-on" text="ON" /><Button layoutX="411.0" layoutY="86.0" mnemonicParsing="false" onAction="controller.onTest('OFF')" prefWidth="150.0" styleClass="button-off" text="OFF" /></children><padding><Insets left="10.0" right="10.0" /></padding></HBox></children><padding><Insets bottom="20.0" left="20.0" right="20.0" top="20.0" /></padding>
</VBox>

基于此示例,用户可以使用SceneBuilder轻松打开FXM1,并添加新的Button来调用controller.onSwitch()方法,以控制为家庭自动化安装的不同/新设备。

FxmlUtils

的下一个版本ShichimiFX将包含新Utilily类负载FXML如图中ExternalFXMLDemoController请注意 ,已加载的窗格通过onLoadExternalFxml()添加到演示应用程序的externalPane (BorderPane)的中心:

public class ExternalFXMLDemoController {@FXMLprivate ResourceBundle resources;@FXMLprivate BorderPane externalPane;@FXMLprivate TextField fxmlFileNameTextField;@FXMLprivate Button chooseFxmlFileButton;@FXMLprivate Button loadFxmlFileButton;private StringProperty fxmlFileName;public void initialize() {fxmlFileNameTextField.textProperty().bindBidirectional(fxmlFileNameProperty());loadFxmlFileButton.disableProperty().bind(fxmlFileNameProperty().isEmpty());}public StringProperty fxmlFileNameProperty() {if (fxmlFileName == null) {fxmlFileName = new SimpleStringProperty("");}return fxmlFileName;}public String getFxmlFileName() {return fxmlFileNameProperty().getValue();}public void setFxmlFileName(String fxmlFileName) {this.fxmlFileNameProperty().setValue(fxmlFileName);}@FXMLpublic void chooseFxmlFile() {FileChooser chooser = new FileChooser();chooser.setTitle("Choose FXML file to load");if (getFxmlFileName().isEmpty()) {chooser.setInitialDirectory(new File(System.getProperty("user.home")));} else {chooser.setInitialDirectory(new File(getFxmlFileName()).getParentFile());}File file = chooser.showOpenDialog(chooseFxmlFileButton.getScene().getWindow());if (file != null) {setFxmlFileName(file.getAbsolutePath());}}@FXMLpublic void onLoadExternalFxml() {try {Optional<URL> url = FxmlUtils.getFxmlUrl(Paths.get(getFxmlFileName()));if (url.isPresent()) {Pane pane = FxmlUtils.loadFxmlPane(url.get(), resources);externalPane.setCenter(pane);} else {Alert alert = new Alert(Alert.AlertType.WARNING);alert.setContentText(getFxmlFileName() + " could not be found!");alert.show();}} catch (IOException ex) {Dialogs.create().showException(ex);}}
}

翻译自: https://www.javacodegeeks.com/2015/01/how-to-allow-users-to-customize-the-ui.html

如何允许用户自定义UI相关推荐

  1. 自定义ui_如何允许用户自定义UI

    自定义ui 理念 利用JavafX / FXML的声明性设计模式,并允许用户仅通过使用例如SceneBuilder打开某个视图即可重新定制布局或添加新控件,甚至根据用户需要更改样式,从而无需任何编码即 ...

  2. ASP.NET 2.0 中实现模板中的数据绑定系列(2)

    双向数据绑定       FormView可以通过相关的数据源控件支持自动地更新.插入和删除操作(与DetailsView类似).如果要定义编辑或插入的UI,那么除了定义数据项模板(ItemTempl ...

  3. 《Java面试题汇总》

    <面试题汇总>之基础篇 一 Java基础 1 基础知识点 1.1 int和Integer的区别 int是整型,是java8中的基本数据类型之一: Integer是int对应的包装类,有一个 ...

  4. 如何进行SDK的测试

    如何进行SDK的测试 一.sdk是什么 SDK,全称:software development kit.客户端SDK是为第三方开发者提供的软件开发工具包,包括SDK接口.接入文档.以及demo等. 可 ...

  5. 项目管理:可视化表单界面设计器

    需求: 目前正在开发一个可视化表单界面设计器,支持拖放,建表建库都可视化,基本需求如下: 1.建数据库表,和表中的字段,支持可视化界面操作 2.自定义表单:可以找个在线html编辑的js控件,有点类似 ...

  6. Android SDK 测试(一)

    本文原文链接:未必平凡博客 https://vv2014.com/372.html 转载请注明出处[vv2014.com] 最近在做Android SDK的测试,因为之前从来没有接触过,所以在这里需要 ...

  7. php千人千面框架,千人千面的设计才是最好设计!安卓 UI 可以如此自由

    手机系统之间的竞逐来到今天,相互之间的差异化比拼已经开始深入细节层面. 人类是视觉动物,于是 UI 细节层面的设计成为手机厂商们的一大交锋之处,大到主题.壁纸.息屏样式.图标风格,小到通知中心样式.字 ...

  8. Bootstrap-Other:UI 编辑器

    ylbtech-Bootstrap-Other:UI 编辑器 1.返回顶部 1. Bootstrap UI 编辑器 以下是 15 款最好的 Bootstrap 编辑器或者是在线编辑工具. 1. Boo ...

  9. 几款流行的HTML5 UI 框架比较

    手机HTML5开发,大部分都使用现有的框架,这里简单比较几个流行的UI 框架.作者(启明星工作室 http://www.dotnetcms.org) 比较一下几款流行的HTML5框架,个人意见,仅供参 ...

最新文章

  1. 速度提升2倍,超强悍CPU级骨干网络PP-LCNet
  2. CTF——MISC——zip伪加密总结
  3. Flume的Avro Sink和Avro Source研究之一: Avro Source
  4. BERT加速 | 预训练模型参数量越来越大?这里有你需要的BERT推理加速技术指南...
  5. 阿里云原生专家复礼:多活容灾建设思路与经验分享
  6. 使用RDP报表工具实现交叉报表
  7. 华为云GaussDB首次亮相2021服贸会,为数字人民币提供坚实数据底座
  8. httpclient.execute长时间停滞问题
  9. 用html如何设计日历,用CSS设计日历
  10. DDD 领域事件设计(基于Guava EventBus二次封装)
  11. leetcode刷题之 剑指offe 面试题05. 替换空格 犯傻记录
  12. 游记_秦皇岛-北戴河两日游
  13. yocto 编译流程分析
  14. ImageMagick将多张图片拼接成一张图片_如何将多张图片排列在一张图片呢?学会这两种技巧,轻松搞定...
  15. 从社会网络角度再现 老干妈和腾讯事件(0712,咯咯咯)
  16. ConvMAE实战:使用ConvMAE实现对植物幼苗的分类(非官方)(一)
  17. 腾讯云服务器如何使用Cloudreve 应用镜像搭建个人云盘?
  18. stata数据处理教学
  19. <Linux基础I/O(1)>——《Linux》
  20. EasyRecovery16计算机电脑硬盘格式化数据恢复软件

热门文章

  1. idea2021部署maven+javaweb项目到jboss(diy)
  2. es6箭头函数(墙裂推荐)
  3. 在Java中如何设置一个定时任务,在每天的一个时间点自动执行一个特定的程序
  4. SonarQube 8.3.x中的Maven项目的测试覆盖率报告
  5. javadoc提取工具_使JavaDoc保持最新状态的工具
  6. java批处理 异常处理_Java批处理教程
  7. junit mockito_使用JUnit 5在Mockito中方便地进行模拟–官方方式
  8. java 迁移数据_Java 9迁移指南:七个最常见的挑战
  9. natty的异步通信框架_OpenHub框架进行的异步通信
  10. c++ lambda 重载_您会后悔对Lambdas应用重载!