javafx - (JavaFX) 如何根据输入的有效性更改文本字段中文本的颜色?
问题描述
我需要知道如何更改文本字段的文本颜色。如果输入无效,则文本应变为红色。如果它是有效的,它应该变回黑色。当我单击文本字段时,颜色需要改变。
我尝试过使用 EventHandler,它确实可以完成某种工作,但是当我单击文本字段时会出现延迟。我的教授说要使用绑定,但我不确定要绑定什么。
import javafx.application.Application;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.geometry.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.stage.*;
import org.junit.Test;
public class DataEntryGUI extends Application{
@Override
public void start(Stage primaryStage){
GridPane root = new GridPane();
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(30, 30, 30, 30));
root.setHgap(5.5);
root.setVgap(5.5);
// TextFields
NameTextField firstName = new NameTextField();
firstName.setPromptText("Name");
firstName.setOnMouseExited(e -> NameTextField.nameIsValid(firstName));
NameTextField secondName = new NameTextField();
secondName.setPromptText("Name");
secondName.setOnMouseExited(e -> NameTextField.nameIsValid(secondName));
NameTextField thirdName = new NameTextField();
thirdName.setPromptText("Name");
thirdName.setOnMouseExited(e -> NameTextField.nameIsValid(thirdName));
PhoneTextField firstNumber = new PhoneTextField();
firstNumber.setPromptText("(###) ###-####");
firstNumber.setOnMouseExited(e -> PhoneTextField.phoneIsValid(firstNumber));
PhoneTextField secondNumber = new PhoneTextField();
secondNumber.setPromptText("(###) ###-####");
secondNumber.setOnMouseExited(e -> PhoneTextField.phoneIsValid(secondNumber));
PhoneTextField thirdNumber = new PhoneTextField();
thirdNumber.setPromptText("(###) ###-####");
thirdNumber.setOnMouseExited(e -> PhoneTextField.phoneIsValid(thirdNumber));
// "Create Profiles" button
StackPane btnPane = new StackPane();
Button btn = new Button("Create Profiles");
btnPane.getChildren().add(btn);
StackPane.setAlignment(btn, Pos.CENTER);
//Enable/Disable button depending on if any TextField is empty
btn.disableProperty().bind(firstName.textProperty().isEmpty()
.or(secondName.textProperty().isEmpty()).or(thirdName.textProperty().isEmpty())
.or(firstNumber.textProperty().isEmpty()).or(secondNumber.textProperty().isEmpty())
.or(thirdNumber.textProperty().isEmpty()));
// Layout of window
root.add(firstName, 0, 0);
root.add(secondName, 0, 1);
root.add(thirdName, 0, 2);
root.add(firstNumber, 1, 0);
root.add(secondNumber, 1, 1);
root.add(thirdNumber, 1, 2);
root.add(btnPane, 0, 3, 2, 3);
// Creating scene
Scene scene = new Scene(root);
primaryStage.setTitle("Data Entry GUI");
primaryStage.setScene(scene); primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
import javafx.scene.control.TextField;
public class NameTextField extends TextField{
public NameTextField(){
super();
}
public NameTextField(String text){
super(text);
}
public static void nameIsValid(NameTextField input) {
String text = input.getText();
if (text.split(" ").length != 2)
input.setStyle("-fx-text-inner-color: red;");
else
input.setStyle("-fx-text-inner-color: black;");
}
}
import javafx.scene.control.TextField;
import javax.xml.soap.Text;
public class PhoneTextField extends TextField {
public PhoneTextField(){
super();
}
public PhoneTextField(String text){
super(text);
}
public static void phoneIsValid(PhoneTextField input){
String text = input.getText();
if (text.split(" ").length != 2)
input.setStyle("-fx-text-inner-color: red;");
else
return;
}
}
解决方案
您可以textProperty
在现场进行:
textField.textProperty().addListener((ObservableValue<? extends String> o, String oldValue, String newValue) ->
{
if (!isStringValidPhoneNumber(newValue))
{
textField.setStyle("-fx-border-color: red ; -fx-border-width: 1px ;");
} else
{
textField.setStyle(null);
}
}
public static boolean isStringValidPhoneNumber (String field)
{
// do the validating here
return false;
}
推荐阅读
- python - 使用 python 为 Outlook 构建加载项
- javascript - 无法使用 JavaScript 和 Leaflet.TextPath 插件将文本插入到传单地图中
- node.js - 无法在 ubuntu 中创建符号链接
- java - 有没有办法在java中访问重复的JPanel的组件?
- python - 如何迭代一个数据帧的每个元素并将元素与另一个数据帧进行比较,然后找到匹配的概率
- azure-aks - Azure 的 CSI 机密存储提供程序是否需要将“hostNetwork”设置为 true?
- python - 如何找到python内置模块的实现python文件,即itertools
- python - 如何在我的 python 项目中添加蜂鸣器?
- java - Python等效于以下AES加密Java代码?
- python - 奇怪的“model.summary”格式