Как создать новое текстовое поле с меткой выше - PullRequest
1 голос
/ 01 августа 2020

Я начал работать над проектом в 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();
    }
    
    
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...