首页 > 解决方案 > (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;

    }
}

标签: javafxinputtextfield

解决方案


您可以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;
}

推荐阅读