【发布时间】:2020-06-24 10:48:35
【问题描述】:
我有一个代表表单字段的自定义组件。它有一个标签、一个文本字段和一个可能在输入验证后显示的错误消息。
<fx:root maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="109.0" prefWidth="512.0" spacing="10.0" styleClass="vbox" type="VBox" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label fx:id="fieldLabel" text="Lorem ipsum dolor sit amet"></Label>
<TextField fx:id="textField" promptText="Lorem ipsum dolor sit amet"></TextField>
<Label fx:id="errorLabel" text=""></Label>
</children>
</fx:root>
public class FormField extends VBox {
@FXML private TextField textField;
@FXML private Label fieldLabel;
@FXML private Label errorLabel;
private String fieldLabelText;
private String promptText;
public FormField(@NamedArg("fieldLabelText") String fieldLabelText,
@NamedArg("promptText") String promptText,
@NamedArg("isPasswordField") boolean isPasswordField) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("../../resources/fxml/form-field.fxml"));
loader.setRoot(this);
loader.setController(this);
this.fieldLabelText = fieldLabelText;
this.promptText = promptText;
try {
loader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
@FXML
public void initialize() {
this.fieldLabel.setText(fieldLabelText);
this.textField.setPromptText(promptText);
}
现在我想知道的是,我将如何对这个组件进行扩展,使其具有PasswordField 而不是TextField?或者传递一个参数,例如boolean isPasswordField,让FormField 决定它应该呈现TextField 还是PasswordField?如果 TextField 在它的 API 中有一个 obscureText(true) 方法就足够了,因为这就是我要找的所有东西,但我找不到任何东西。
我能找到的关于 JavaFX 继承的所有信息都是通过向对象添加新组件来“扩展”对象,而不是通过更改它的现有元素。
【问题讨论】:
-
顺便说一句,请注意您的 FXML 的路径不正确(打包应用程序时它将不起作用)。见stackoverflow.com/questions/61531317/…。