1. 程式人生 > >J3002.JavaFX組件擴展(二)——StringField

J3002.JavaFX組件擴展(二)——StringField

eval charat pub name valid desc insets sin 技術

我們在界面上處理String類型的數據時,一般需要做到以下基本控制:

一、提供默認值;

二、確認是否可以為空;

三、限定最大輸入長度(支持中文判斷);

JavaFX提供的TextField並沒有提供上述功能,所以我們需要對其進行擴展。

StringField類:

package com.lirong.javafx.demo.j3002;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.scene.control.TextField;

/**
 * <p>Title: LiRong Java Application Platform</p>
 * Description: <br>
 * Copyright: CorpRights lrJAP.com<br>
 * Company: lrJAP.com<br>
 *
 * @author yujj
 * @version 1.1.1
 * @date 2018-04-29
 * @since 9.0.4
 */
public class StringField extends TextField {

    private IntegerProperty maxLength = new SimpleIntegerProperty();

    public StringField() {

        this(-1, null);
    }

    public StringField(final Integer maxLength) {

        this(maxLength, null);
    }

    public StringField(Integer maxLength, final String defaultValue) {

        super();
        // 限制輸入最大長度
        textProperty().addListener((observableValue, oldValue, newValue) -> {

            if (!checkValueLengthValid(newValue)) {
                setText(oldValue);
            }
        });
        // 設置最大允許長度
        if (maxLength == null) {
            maxLength = -1;
        }
        setMaxLength(maxLength);
        if (isNotBlank(defaultValue)) {
            // 設置默認值
            setText(defaultValue);
        }
    }

    protected boolean checkValueLengthValid(final String value) {

        if (getMaxLength() != null && getMaxLength() > 0 && isNotBlank(getText()) && lenOfChinesString(value) > getMaxLength()) {
            return Boolean.FALSE;
        }
        return Boolean.TRUE;
    }

    public Integer getMaxLength() {

        return maxLength.get();
    }

    public IntegerProperty maxLengthProperty() {

        return maxLength;
    }

    public void setMaxLength(Integer maxLength) {

        this.maxLength.set(maxLength);
    }

    // 建議使用apache commons-lang3中提供的StringUtils類
    public static boolean isNotBlank(final String str) {

        return (str != null && !"".equalsIgnoreCase(str));
    }

    // 應作為工具方法
    public static int lenOfChinesString(final String str) {

        int len = 0;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (c >= ‘\u4e00‘ && c <= ‘\u9fa5‘) {
                len += 2;
            } else {
                len++;
            }
        }
        return len;
    }
}

測試類:

package com.lirong.javafx.demo.j3002;

import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

/**
 * <p>Title: LiRong Java Application Platform</p>
 * Description: <br>
 * Copyright: CorpRights lrJAP.com<br>
 * Company: lrJAP.com<br>
 *
 * @author yujj
 * @version 1.1.1
 * @date 2018-04-29
 * @since 9.0.4
 */
public class TestStringField extends Application {

    public static void main(String[] args) {

        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        GridPane gridPane = new GridPane();
        gridPane.setPadding(new Insets(10));
        gridPane.setVgap(10);
        gridPane.setHgap(10);

        ColumnConstraints col1 = new ColumnConstraints();
        col1.setPercentWidth(40);

        ColumnConstraints col2 = new ColumnConstraints();
        col2.setPercentWidth(60);

        gridPane.getColumnConstraints().addAll(col1, col2);

        // 在GridPane中放置兩個StringField
        Label lblCode = new Label("編碼:");
        StringField stringCode = new StringField();
        // 設置最大輸入長度
        stringCode.setMaxLength(8);

        Label lblName = new Label("名稱:");
        // 設置最大輸入長度以及默認值
        StringField stringName = new StringField(16, "DemoName");

        // label右對齊
        GridPane.setHalignment(lblCode, HPos.RIGHT);
        GridPane.setHalignment(lblName, HPos.RIGHT);

        gridPane.addRow(0, lblCode, stringCode);
        gridPane.addRow(1, lblName, stringName);

        Scene scene = new Scene(gridPane, 400, 300);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

運行效果:

技術分享圖片

J3002.JavaFX組件擴展(二)——StringField