Я начал работать над проектом в Java. Я использую sh для создания элемента управления в JavaFX, аналогичного TextField, но с меткой в верхнем левом углу. кроме того, текстовое поле содержит SimpleBooleanProperty, чтобы указать, ввел ли пользователь допустимую строку на основе регулярного выражения.
Я попытался расширить текстовое поле и добавить метку в качестве своего дочернего элемента, но метка была создана внутри текстового поля.
Вот код для CustomTF
package OrderPackage;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.geometry.NodeOrientation;
import javafx.scene.Parent;
import javafx.scene.control.Label;
import javafx.util.Duration;
public class CustomTF extends ValidationTextField {
private Label desc = new Label();
private Timeline animation = new Timeline();
public CustomTF() {
this("");
}
public CustomTF(String promptText) {
// this.setNodeOrientation(NodeOrientation.RIGHT_TO_LEFT);
this.setPromptText(promptText);
desc.setOpacity(0);
desc.textProperty().bind(this.promptTextProperty());
this.focusedProperty().addListener((obs, old, news) -> {
if (news) {
animation.getKeyFrames().addAll(
new KeyFrame(Duration.millis(0), new KeyValue(desc.opacityProperty(), 0)),
new KeyFrame(Duration.millis(200), new KeyValue(desc.opacityProperty(), 1)),
new KeyFrame(Duration.millis(0), new KeyValue(desc.layoutYProperty(), this.getLayoutY())),
new KeyFrame(Duration.millis(200), new KeyValue(desc.layoutYProperty(), this.getLayoutY() - 25)));
}
else {
animation.getKeyFrames().addAll(
new KeyFrame(Duration.millis(0), new KeyValue(desc.opacityProperty(), 1)),
new KeyFrame(Duration.millis(200), new KeyValue(desc.opacityProperty(), 0)),
new KeyFrame(Duration.millis(0), new KeyValue(desc.layoutYProperty(), this.getLayoutY() - 25)),
new KeyFrame(Duration.millis(250), new KeyValue(desc.layoutYProperty(), this.getLayoutY())));
}
animation.play();
animation.getKeyFrames().clear();
});
this.getChildren().addAll(desc);
}
public Label getLabelPromptText() {
return desc;
}
}
Вот код для ValidationTextField
package OrderPackage;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.scene.control.TextField;
public class ValidationTextField extends TextField{
private SimpleBooleanProperty validationProperty = new SimpleBooleanProperty(false);
private Validation validationRule;
public ValidationTextField() {
this(Validation.ANY);
}
public ValidationTextField(Validation validationRule) {
super();
this.validationRule = validationRule;
}
public void setValidationRule(Validation validationRule) {
this.validationRule = validationRule;
}
public boolean validate() {
return this.getText().trim().matches(validationRule.getValidation());
}
public SimpleBooleanProperty validationProperty() {
return validationProperty;
}
public String getValidation() {
return validationRule.getValidation();
}
}