Initial project
This commit is contained in:
152
src/main/java/com/imyeyu/fx/ui/components/NumberField.java
Normal file
152
src/main/java/com/imyeyu/fx/ui/components/NumberField.java
Normal file
@ -0,0 +1,152 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user