无法使用 ControlsFX 创建可清除的文本字段

Can not create clearable textField using ControlsFX

我使用 Scene Builder 创建了 TextField,但是当我尝试使用 KeyEvent 时,它不起作用。

public class FXMLDocumentController implements Initializable {

    @FXML
    private TextField searchPatient;      

    @FXML
    void keyTyped(KeyEvent event) {
        this.searchPatient = TextFields.createClearableTextField();
    }

}

这里是主要的class:

public class MyFX extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);

        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

这里是FXMLDocument.fxml:

<AnchorPane id="AnchorPane" prefHeight="597.0" prefWidth="726.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.homeo.home.FXMLDocumentController">
   <children>
      <TextField fx:id="searchPatient" layoutX="14.0" layoutY="109.0" onKeyTyped="#keyTyped" prefHeight="26.0" prefWidth="372.0" promptText="Search" />
   </children>
</AnchorPane>

我不想依赖代码进行设计,这就是为什么我想使用 ControlsFX 和 IDE 生成的代码。

I'm expecting textfield must show clear icon as I enter few text in a textfield that's called clearableTextFieldf.

但是上面的所有代码并没有像我预期的那样工作。

It does not create ClearableTextField

您正在场景中放置的常规 TextFieldKEY_TYPED 事件处理程序中创建 TextField。但是,新创建的 TextField 从未添加到任何场景。

您可以使用 fx:factory 属性来使用 static 方法来创建 FXMLLoader 添加到场景的 TextField

...
<?import org.controlsfx.control.textfield.TextFields?>

<AnchorPane id="AnchorPane" prefHeight="597.0" prefWidth="726.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.homeo.home.FXMLDocumentController">
   <children>
      <TextFields fx:factory="createClearableTextField" fx:id="searchPatient" layoutX="14.0" layoutY="109.0" prefHeight="26.0" prefWidth="372.0" promptText="Search" />
   </children>
</AnchorPane>

您也可以使用 initialize 方法来创建和添加您的 TextField

public class FXMLDocumentController implements Initializable {

    ...
    @FXML
    private AnchorPane anchorPane;

    @Override
    public void initialize(URL location, Resources resources)
        searchPatient = TextFields.createClearableTextField();
        searchPatient.setLayoutX(14.0);
        searchPatient.setLayoutY(109.0);
        searchPatient.setPrefSize(372.0, 26.0);
        searchPatient.setPromptText("Search");
        anchorPane.getChildren().add(searchPatient);
        ...
    }
}
<AnchorPane fx:id="anchorPane" id="AnchorPane" prefHeight="597.0" prefWidth="726.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.homeo.home.FXMLDocumentController" />