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

自定义ui

理念

利用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | 内部与外部函数

C语言函数的声明和定义一个函数一般由两部分组成&#xff1a;声明部分执行语句C语言对变量而言&#xff0c;声明与定义的关系稍微复杂一些&#xff0c;在声明部分出现的变量有两种情况&#xff1a;一种是需要建立存储空间的。另一种是不需要建立存储空间的。前者称为定义性声明…

进程和线程计算机组成原理面试题,2016年云南财经大学信息学院计算机组成原理复试笔试最后押题五套卷...

一、选择题1&#xff0e; 设文件索引节点中有7个地址项&#xff0c;其中4个地址项为直接地址索引&#xff0c;2个地址项是一级间接地址索引&#xff0c;1个地址项是二级间接地址索引&#xff0c;每个地址项大小为4字节&#xff0c;若磁盘索引块和磁盘数据块的大小均为256字节&a…

获取客户端ip_代理IP工具能否解决反爬?

互联网已成了生活中的部分&#xff0c;从事互联网的工作者&#xff0c;避免不了需要去一些网站上进行爬取需要的数据来达到自己产品或者业务上的需求。比如反爬策略&#xff0c;但是&#xff0c;使用代理IP工具一定可以解决反爬虫策略吗&#xff1f;一、不同的网站有不同的反爬…

C语言 | 结构体数组

C语言结构体数组概述一个结构体变量中可以存放一组有关联的数据&#xff0c;如一个学生的学号、姓名、成绩等数据&#xff0c;如果有10个学生的数据需要参加运算&#xff0c;显然应该用数组&#xff0c;这就是结构体数组。结构体数组与之前介绍的数值型数组的不同之处在于每个数…

html弹窗代码y\/n,Nodejs扩展,实现消息弹窗(示例代码)

模块的C代码 node_gtknotify.cc#include #include #include #include #include using namespace v8;class GtkNotify : node::ObjectWrap{public:GtkNotify(){}~GtkNotify(){}std::string title;std::string icon;static Persistent persistent_function_template;static void …

LeetCode 每日一题 Day 21|| 堆

1962. 移除石子使总数最小 给你一个整数数组 piles &#xff0c;数组 下标从 0 开始 &#xff0c;其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k &#xff0c;请你执行下述操作 恰好 k 次&#xff1a; 选出任一石子堆 piles[i] &#xff0c;并从中 移除 floo…

python脚本语言采用声音作为手段_LKJ自动化测试脚本定义及生成技术研究

LKJ自动化测试脚本定义及生成技术研究白鸿钧&#xff0c;张明凯&#xff0c;李冠军&#xff0c;杨清祥【摘要】摘要&#xff1a;为实现对列车运行控制系统软件的自动化测试&#xff0c;在通用脚本语言的基础上定义专用的脚本语言&#xff0c;讨论专用脚本语言的结构和组成&…

java ee jsp_EE JSP:Servlet的反向外套

java ee jsp仅当页面数量少或需要对生成的内容&#xff08;二进制PDF等&#xff09;进行精细控制时&#xff0c;才可以从Servlet生成HTML。 对于大多数应用程序&#xff0c;输出将是HTML&#xff0c;我们需要一种更好的方法来完成此操作。 这就是JSP&#xff08;Java服务器页面…

C语言 | 结构体指针

C语言指向结构体变量的指针在C语言中&#xff0c;指向结构体对象的指针变量既可以指向结构体变量&#xff0c;也可指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。C语言中允许 &#xff08;*p&#xff09;.num用p->num来代替 ->代表一个箭头 p-&g…

计算机网络安全管理协议,河西学院校园网络安全管理协议

第一条 总 则一.河西学院校园网络接入单位的所有用户必须遵守《中华人民共和国计算机信息网络国际联网管理暂行规定》、《河西学院校园网络管理暂行规定》及国家有关法律法规&#xff0c;严格执行安全保密制度&#xff0c;并对所提供的信息负责。二.河西学院校园网络的所有用户…

C语言 | 变量的存储方式

C语言动态存储方式与静态存储方式静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式&#xff1b;动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。内存中的供用户使用的存储空间可以分为3部分&#xff0c;程序区静态存储区动态存储区全局变量…

设计模式装饰者模式_装饰者模式如何拯救了我的一天

设计模式装饰者模式在工作中&#xff0c;我正在处理庞大的Java代码库&#xff0c;该代码库是由许多不同的开发人员在15年的时间里开发的。 并不是所有的事情都由书来完成&#xff0c;但是同时我通常无法重构遇到的每一个奇怪的事物。 尽管如此&#xff0c;仍可以每天采取提高代…

初学者选黑卡还是微单_明日之镜 十年索尼微单和他的镜头王国

2010年索尼微单诞生&#xff0c;与之一同而来的还有全新的E卡口。十年间&#xff0c;E卡口从APS-C走向了全画幅&#xff0c;从静态影像走向了专业摄像。并且准瞬间通过机器与机器、镜头与镜头架起了消费级与专业级的桥梁。想来一个卡口创作无限界大抵就是如此吧。起源一枚扫街用…

建德有没有计算机培训,建德计算机培训,建德计算机培训班,建德计算机培训完好找工作吗 - IT教育频道...

建德计算机培训首页>计算机> 建德计算机培训作者&#xff1a;镀金池 发布时间&#xff1a;2018-10-09在面向对象编程中&#xff0c;我们见过对象(object)。若是Context 对象想要在办事外部的事务产生时被告诉&#xff0c;那就需要把本身注册到办事的监听器中。将请求天…

C语言 | 字符数组

C语言字符数组的定义字符数组是用来存放字符数据的数组&#xff0c;字符数组中的一个元素存放一个字符&#xff0c;定义字符数组的方法和定义数值型数组的方法类似。//例子&#xff1a;char character[10];C语言字符数组的初始化C语言对字符数组初始化&#xff0c;最容易理解的…

python删除字符串中指定_python删除字符串中指定字符

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

linux暗转旧版java_Java旧版不断发展

linux暗转旧版java最近&#xff0c;我偶然发现了JDK API的一个非常有趣的警告&#xff0c;即Class.getConstructors()方法。 它的方法签名是这样的&#xff1a; Constructor<?>[] getConstructors()有趣的是&#xff0c; Class.getConstructor(Class...)返回一个Constr…

北科大计算机技术研招考纲,北京科技大学2021年全国硕士研究生招生考试自命题科目考试大纲...

中国民用航空飞行学院2021年硕士研究生招生考试初试自命题科目大纲已公布&#xff0c;考研大纲是规定全国硕士研究生入学考试相应科目的考试范围、考试要求、考试形式、试卷结构等权威政策指导性考研用书。本文整理“北京科技大学2021年全国硕士研究生招生考试自命题科目考试大…

C语言和指针的本质是什么?技术大神给出答案

很多编程语言都以 “没有指针” 作为自己的优势来宣传&#xff0c;然而&#xff0c;对于C语言&#xff0c;指针却是与生俱来的。那么&#xff0c;什么是指针&#xff0c;为什么大家都想避开指针。很简单&#xff0c; 指针就是地址&#xff0c;当一个地址作为一个变量存在时&…

fastdfs的tracker启动之后一直选举_jraft选举策略

一、角色划分Follower&#xff1a;完全被动&#xff0c;不能发送任何请求&#xff0c;只接受并响应来自leader 和 candidate 的 message&#xff0c;每个节点启动后的初始状态一定是follower&#xff1b;Leader&#xff1a;处理所有来自客户端的请求&#xff0c;以及复制 log到…