Files
timi-fx-ui/src/main/java/com/imyeyu/fx/ui/components/NumberField.java
2025-07-14 15:08:16 +08:00

153 lines
2.8 KiB
Java

package com.imyeyu.fx.ui.components;
import com.imyeyu.java.TimiJava;
import com.imyeyu.utils.Calc;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
/**
* 数字输入框
*
* @author 夜雨
* @since 2021-12-29 21:59
*/
public class NumberField extends TextField {
/** 数值 */
private final DoubleProperty value;
private boolean isBackSpace = false;
/** 默认构造 */
public NumberField() {
this("");
}
/**
* 数字输入组件构造
*
* @param text 默认数值字符串
*/
public NumberField(String text) {
super(text);
value = new SimpleDoubleProperty();
value.addListener((obs, o, newValue) -> {
if (newValue.doubleValue() % 1 == 0) {
setText(String.valueOf(newValue.intValue()));
} else {
setText(String.valueOf(newValue.doubleValue()));
}
});
textProperty().addListener((obs, o, newText) -> {
if (Calc.isNumber(newText)) {
if (getDouble() % 1 == 0) {
value.set(getInt());
} else {
value.set(getDouble());
}
}
});
addEventFilter(KeyEvent.KEY_PRESSED, e -> isBackSpace = e.getCode() == KeyCode.BACK_SPACE);
setTextFormatter(new TextFormatter<>(c -> {
String newText = c.getControlNewText();
if (!newText.equals("")) {
if (newText.equals("+") || newText.equals("-")) {
return c;
}
if (Calc.isNumber(newText)) {
if (isBackSpace && newText.endsWith(".")) {
c.setRange(c.getRangeStart() - 1, c.getRangeEnd());
return c;
}
return c;
} else {
return null;
}
} else {
return c;
}
}));
}
/**
* 设置当前值
*
* @param number 当前值
*/
public void setValue(Number number) {
setText(String.valueOf(number));
}
/**
* 获取为双精度浮点值
*
* @return 双精度浮点值
*/
public double getDouble() {
return getValue().doubleValue();
}
/**
* 获取为长整值
*
* @return 长整值
*/
public long getLong() {
return getValue().longValue();
}
/**
* 获取为短整值
*
* @return 短整值
*/
public int getInt() {
return getValue().intValue();
}
/**
* 获取为单精度浮点值
*
* @return 单精度浮点值
*/
public float getFloat() {
return getValue().floatValue();
}
/**
* 获取数字对象
*
* @return 数字对象
*/
public Number getValue() {
if (TimiJava.isEmpty(getText())) {
return null;
}
return Double.parseDouble(getText());
}
/**
* 获取数值属性
*
* @return 数值属性
*/
public DoubleProperty valueProperty() {
return value;
}
/**
* 设置值
*
* @param value 值
*/
public void setValue(double value) {
this.value.set(value);
}
}