输入框类

package tm.vision.ui.utils;import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.event.Event;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.ContextMenuEvent;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.HBox;import java.util.stream.IntStream;/************************************************<函数名称>   TimeField<功    能>   时间输入控件<参数说明>   []<返回值>     void<作    者>   MUYI**************************************************/
public class TimeField extends HBox {private final int SEPARATORS_SIZE = 2;private final int TEXTFIELD_NUMBER = 3;private final Label[] separators  = {new Label(":"), new Label(":")};private final TextField[] textFields  = {new TextField(), new TextField(), new TextField()};private final StringProperty text = new SimpleStringProperty();public TimeField() {// 添加光标移动规则 //caretMoveRegular();// 文本格式规则 //formatRegular();IntStream.range(0, TEXTFIELD_NUMBER).forEach(index -> {if (index != 0) {getChildren().add(separators[index - 1]);}getChildren().add(textFields[index]);});disableProperty().addListener(observable -> {for (Label separator : separators) {separator.setVisible(!isDisable());}});}public TimeField(String time) {new TimeField();setTimeText(time);}private void formatRegular() {String[] regex = new String[3];regex[0] = "^[0-1]?[0-9]|[2]?[0-3]$";regex[1] = "^[0-5]?[0-9]$";regex[2] = "^[0-5]?[0-9]$";String[] MaxValue = new String[3];MaxValue[0] = "23";MaxValue[1] = "59";MaxValue[2] = "59";IntStream.range(0, TEXTFIELD_NUMBER).forEach(index -> {textFields[index].textProperty().addListener((observable, oldValue, newValue) -> {if (newValue.length() >= 3) {if (index < TEXTFIELD_NUMBER - 1 && textFields[index].getCaretPosition() == SEPARATORS_SIZE) {textFields[index + 1].requestFocus();textFields[index + 1].positionCaret(0);}textFields[index].setText(oldValue);}else if (!newValue.matches(regex[index]) && !newValue.isBlank()) {textFields[index].setText(MaxValue[index]);} else {textFields[index].setText(newValue);text.set(textFields[0].getText() + ":" + textFields[1].getText() + ":" + textFields[2].getText());}});textFields[index].focusedProperty().addListener(observable -> {if (!isFocused() && !isDisable()) {// 空白格置0 //if (textFields[index].getText().isBlank()) {textFields[index].setText("00");}// 1位补0 //if(textFields[index].getText().length() == 1){textFields[index].setText("0" + textFields[index].getText());}}});});}private void caretMoveRegular() {IntStream.range(0, TEXTFIELD_NUMBER).forEach(index -> {textFields[index].setPrefWidth(20);textFields[index].addEventFilter(ContextMenuEvent.CONTEXT_MENU_REQUESTED, Event::consume);textFields[index].addEventFilter(KeyEvent.KEY_PRESSED, (KeyEvent keyEvent) -> {// 按下“->”键 //if (keyEvent.getCode().equals(KeyCode.RIGHT)) {if (index < TEXTFIELD_NUMBER - 1 && textFields[index].getCaretPosition() == textFields[index].getText().length()) {textFields[index + 1].requestFocus();textFields[index + 1].positionCaret(0);keyEvent.consume();}}// 按下“<-”键 //if (keyEvent.getCode().equals(KeyCode.LEFT) ) {if (index > 0 && textFields[index].getCaretPosition() == 0) {textFields[index - 1].requestFocus();textFields[index - 1].positionCaret(textFields[index - 1].getText().length());keyEvent.consume();}}// 按下“BackSpace”键 //if (keyEvent.getCode().equals(KeyCode.BACK_SPACE)) {// 在边界再按一次往前移动光标 //if (index > 0 && textFields[index].getCaretPosition() == 0) {textFields[index - 1].requestFocus();textFields[index - 1].positionCaret(textFields[index - 1].getText().length());keyEvent.consume();}}});});}public final void setTimeText(String content) {String[] times = content.split(":");if (times.length != TEXTFIELD_NUMBER) {clearText();return;}for (int i = 0; i < times.length; i++) {textFields[i].setText(times[i]);}text.set(content);separators[0].setVisible(true);separators[1].setVisible(true);}public final StringProperty textProperty() { return text; }public final String getText() {StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < TEXTFIELD_NUMBER; i++) {stringBuilder.append(textFields[i].getText()).append(":");}stringBuilder.deleteCharAt(stringBuilder.length() - 1);text.set(stringBuilder.toString());return text.get();}public TextField[] getTextFields() {return textFields;}public void clearText() {IntStream.range(0,TEXTFIELD_NUMBER).forEach(index -> textFields[index].clear());separators[0].setVisible(false);separators[1].setVisible(false);}public void setSeparatorStyleClass(String style) {for (Label label :separators) {label.getStyleClass().clear();label.getStyleClass().add(style);}}public void setInputTextStyleClass(String style) {for (TextField textField :textFields) {textField.getStyleClass().clear();textField.getStyleClass().add(style);}}
}

CSS

.experiment-time-field-separator {-fx-text-fill: #CDCDCD;-fx-font-size: 14;-fx-font-weight: 400;-fx-pref-height: 30;
}.experiment-time-field-text {-fx-border-color: transparent;-fx-text-fill: #CCCCCC;-fx-font-size: 14;-fx-font-weight: 400;-fx-padding: 0 0 0 0;-fx-pref-height: 30;
}

调用

/* 设置时间输入框样式 */
experimentTimeField.setSeparatorStyleClass("experiment-time-field-separator");
experimentTimeField.setInputTextStyleClass("experiment-time-field-text");/* 加长最后一个框方便选中 */
experimentTimeField.getTextFields()[2].setPrefWidth(100);/* 设置时间格式 */
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
/* 将时间戳设置到时间输入框中 */
experimentTimeField.setTimeText(simpleDateFormat.format(new Date(timestamp)));

javafx 时间输入框相关推荐

  1. java输入框1-100_Java开发笔记(一百三十九)JavaFX的输入框

    循着Swing的旧例,JavaFX仍然提供了三种文本输入框,分别是单行输入框TextField.密码输入框PasswordField.多行输入框TextArea.这些输入框都由抽象类TextInput ...

  2. input 起止时间_input时间输入框小解

    date    年月日 month 年月 week   年周(ios上不可用,android部分会显示当前是第几周) time   时分(ios不显示时/分的字样) datetime 为一输入框,基本 ...

  3. java文本输入框_Java开发笔记(一百三十九)JavaFX的输入框

    循着Swing的旧例,JavaFX仍然提供了三种文本输入框,分别是单行输入框TextField.密码输入框PasswordField.多行输入框TextArea.这些输入框都由抽象类TextInput ...

  4. input 起止时间_完整的时间(开始和结束时间)输入框验证js

    1.html (1)时间输入框 当使用时间插件改变时间时,会触发onchange()事件 起始时间: οnfοcus="WdatePicker({dateFmt:'yyyy-MM-dd HH ...

  5. java界面日期选择控件,JavaFX界面设计之时间选择器(1)

    本章我们主要介绍javafX时间选择器的使用,描述了DatePicker控件的基本特性. javaFX的DatePicker控件可以让我们从一个给定的日历中选择一天,主要用于网站或应用中需要用户输入一 ...

  6. UIDatePicker | 时间选择器

    一:UIDatePicker的介绍 UIDatePicker 是一个控制器类,封装了 UIPickerView,但是他是UIControl的子类,专门用于接受日期.时间和持续时长的输入. 日期选取器的 ...

  7. 输入框精确到秒html,分享下input time输入框的细节知识

    最近与type="time"类型的input输入框打了不少交道,学到了不少知识,和大家分享下. 一.关于兼容性和UI表现 1. Safari浏览器 Safari桌面端浏览器目前并不 ...

  8. js手机键盘遮挡_iphone手机微信页面软键盘遮挡input输入框解决方法

    现象描述:iphone手机微信页面,用position: fixed;定位的input或textarea输入框,在获取输入焦点时,会被弹出的输入法软键盘遮挡,导致用户无法看到输入框,效果如图: 简化测 ...

  9. element时间选择器限制到时分秒_ElementUI日期选择器时间选择范围限制

    Element是一套基于vue2.x的一个ui框架.官方文档也很详细,这里记录一个element-ui日期插件的补充 官方文档中使用picker-options属性来限制可选择的日期,下面举例补充: ...

  10. 移动端输入框禁止软键盘弹出

    输入框: <el-input v-model="value" @focus="forbid" />//focus 聚焦事件forbid () {do ...

最新文章

  1. recycleView 滑动删除Item,拖拽切换Item,你想了解的都在这儿
  2. axios请求GBK页面中文乱码解决方法
  3. GARFIELD@05-04-2005
  4. 流行的编程语言及其趋势
  5. mysql 备份脚本
  6. python查询斐波那契数列通项公式_斐波那契数列求解总结(Python版)
  7. 劳务费计算用matlab实现
  8. 使用WinAPI替代System.IO.Directory
  9. 序列化和反序列化(七)——Java对象的网络传输(二)
  10. sap的pod确认_PO确认控制
  11. 郭盛华为什么不去阿里巴巴?原因竟是这个
  12. linux写含输入输出的代码,linux系统管理-输入输出
  13. 业内人士给龙年买房人的15条忠告 看到的有福了
  14. 手把手教你拿到小世界里妹子的 QQ 号 !
  15. 结合北斗PPP_B2b 导航电文进行精密定位(PPP)
  16. win10打开蓝牙_双系统共用蓝牙键鼠(win10+macOS)
  17. 计算机网络原理第3章 数据链路层 (超全知识点+例题)
  18. 去美元化:曾经被称为加密的地缘政治问题
  19. chrome谷歌浏览器:您使用的是不受支持的命令行标记:--extensions-on-chrome-urls
  20. 笔记本电脑(laptop)通常具备使用USB设备的功能.实现接口回调(使用面向对象思想编程:接口,多态等).

热门文章

  1. Android Q分区存储权限变更及适配
  2. 数字媒体技术和数据科学与大数据技术_数据科学与大数据技术专业的女同学,迈出了她的舒适圈...
  3. powerbi python词云图_Power BI 标签云可视化
  4. 软件测试算是后端吗,软件测试--前后端数据交互
  5. channel串行化_为什么串行接口比并行接口快
  6. map赋值给另一个map_如何写出一个能让面试官直呼“666”的深拷贝?
  7. jq ajax渲染数据慢,Jquery Ajax 如何实现延时加载 。即很多网站上面的Loading。。。动态提时候,延时几秒,才显示出服务器的响应数据...
  8. 数据库常用的事务隔离级别都有哪些?都是什么原理?
  9. windows关闭被占用的端口
  10. 转,python的匿名函数lambda解释及用法