Не удается создать очищаемый textField с помощью ControlsFX - PullRequest
1 голос
/ 22 сентября 2019

Я создал TextField, используя Scene Builder, но когда я попробовал его с KeyEvent, но он не работает.

public class FXMLDocumentController implements Initializable {

    @FXML
    private TextField searchPatient;      

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

}

Вот основной класс:

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.

Я ожидаю, что textfield должен показывать четкую иконку, когда я ввожу немного текста в textfield, который называется clearableTextFieldf.

Но с приведенным выше кодом все работает не так, как я ожидал.

Не создает ClearableTextField

1 Ответ

3 голосов
/ 22 сентября 2019

Вы создаете TextField в обработчике событий KEY_TYPED обычного TextField, размещенного на вашей сцене.Недавно созданный TextField никогда не добавляется ни в одну сцену.

Вы можете использовать атрибут fx:factory, чтобы использовать метод static для создания TextField, который FXMLLoader добавляет к сцене:

...
<?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" />
...