使用JavaFX和FXML验证用户输入

Moe*_*Moe 0 java javafx fxml

使用JavaFX和FXML我想在用户提交时验证用户的输入.查看.fxml文档,您会看到我有两个输入字段,一个用于邮政编码,另一个用于城市名称.我正在从xml文件中强制执行NumberTextField.java和CityNameTextField.java,但是如何在用户点击提交时确保它们不是空白的?

FXMLDocument.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import validatetextfieldsfxml.custom.*?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label layoutX="173.0" layoutY="89.0" text="ZipCode" />
      <Label layoutX="173.0" layoutY="118.0" text="CityName" />
      <NumberTextField fx:id="zipCodeTf" layoutX="257.0" layoutY="84.0" />
      <CityNameTextField fx:id="cityNameTf" layoutX="257.0" layoutY="113.0" />
      <Button fx:id="btn" layoutX="217.0" layoutY="162.0" mnemonicParsing="false" text="Submit" />
   </children>
</Pane>
Run Code Online (Sandbox Code Playgroud)

CityNameTextField.java

package validatetextfieldsfxml.custom;

import javafx.scene.control.TextField;
public class CityNameTextField extends TextField {

   public CityNameTextField(){
       this.setPromptText("Enter Your CityName");
   }

   @Override
   public void replaceText(int i, int il, String string){
       if(string.matches("[a-zA-Z]") || string.isEmpty()){
          super.replaceText(il, il, string);
       }
   }

    @Override
    public void replaceSelection(String string) {
        super.replaceSelection(string); 
    }



}
Run Code Online (Sandbox Code Playgroud)

NumberTextField.java

package validatetextfieldsfxml.custom;
import javafx.scene.control.TextField;

public class NumberTextField extends TextField{
    public NumberTextField(){
        this.setPromptText("Enter Only numbers");
    }
    @Override
    public void replaceText(int i, int il, String string){
        if(string.matches("[0-9]") || string.isEmpty() ){
            super.replaceText(i, il, string);
        }
    }

    @Override
    public void replaceSelection(String string){
        super.replaceSelection(string);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 6

在你的控制器的initialize方法中,就这样做

btn.disableProperty().bind(zipCodeTf.textProperty().isEmpty()
    .or(cityNameTf.textProperty().isEmpty()));
Run Code Online (Sandbox Code Playgroud)

您也可以直接在FXML文件中执行此操作

  <Button fx:id="btn" text="Submit" 
       disable="${ cityNameTf.text.empty || zipCodeTf.text.empty }"/>
Run Code Online (Sandbox Code Playgroud)

  • 你想要的任何方式.在您使用的UI中通常如何完成?添加一个标签,说明值是必需的,在文本字段上使用`promptText`,在文本字段旁边放一个`*`,使用工具提示....只需按照您认为的方式实现它,即可提供最佳用户体验. (2认同)
  • Moe 有一些现有的库可以提供验证实施帮助,[ControlsFX](http://fxexperience.com/controlsfx/features/#decorationvalidation)、[JideFX](http://www.jidesoft.com/jidefx/JideFX_Validation_Developer_Guide .pdf)、[FXForm2](http://dooapp.github.io/FXForm2/),可能还有其他一些。您可以使用这些框架之一,也可以从头开始编写自己的验证器。如果只是要验证一两个文本字段,我将只实现我自己的验证,如果它是基于大型表单的应用程序,则调查库。 (2认同)