Как сделать постоянный кейлист для моего собственного текстового поля?Джава - PullRequest
0 голосов
/ 21 марта 2019

У меня проблема, я пытался найти какое-то решение, но оно оказалось безуспешным.Я создал свой собственный класс Textfield

public class TextField extends Group {
private javafx.scene.control.TextField textField;
private Label label;
private Rectangle border;


TextField(String blowzyText, int width, int height, boolean password){

    String text = addSpaces(blowzyText);

    if(password) textField = new PasswordField();
    else textField = new javafx.scene.control.TextField();
    label = new Label(text);
    border = new Rectangle();

    getChildren().add(border);
    getChildren().add(label);
    getChildren().add(textField);

    textField.setPrefSize(width,height);
    textField.setMaxSize(width,height);
    textField.setMinSize(width,height);
    textField.setFont(Font.font("Open Sans", 25));
    textField.setStyle("-fx-text-fill: white;");

    textField.setBackground(Background.EMPTY);

    textField.setOnKeyPressed(e->{
        if(textField.getCharacters().length() == 1){
            if(e.getCode() == KeyCode.DELETE){
                if(textField.getCaretPosition() == 0){
                    label.setText(text);
                }
            }
            else if(e.getCode() == KeyCode.BACK_SPACE){
                if(textField.getCaretPosition() == 1){
                    label.setText(text);
                }
            }

        }
        else if(textField.getCharacters().length() == 0 && (e.getText().length() > 0)){
            if(e.getCode() != KeyCode.TAB) {
                label.setText(" ");
            }
        }
        else if((textField.getSelectedText().length() == textField.getCharacters().length()) && ((e.getCode() == KeyCode.DELETE) || (e.getCode() == KeyCode.BACK_SPACE))){
            label.setText(text);
        }
    });

    label.setPrefSize(width,height);
    label.setMaxSize(width,height);
    label.setMinSize(width,height);
    label.setTextFill(Color.WHITE);
    label.setFont(Font.font("Open Sans", 25));

    border.setHeight(height);
    border.setWidth(width);
    border.setStroke(Color.WHITE);
    border.setStrokeWidth(1.5);
    border.setFill(Color.TRANSPARENT);
    border.setArcHeight(40);
    border.setArcWidth(40);

}
private String addSpaces(String text){
    StringBuilder str = new StringBuilder(text);
    StringBuilder space = new StringBuilder("  ");
    return space.append(str).toString();
}
public String getText(){
    return textField.getCharacters().toString();
}
public javafx.scene.control.TextField getClickable(){
    return textField;
}

И в другом классе я создаю объект

TextField name = new TextField("Login", width, height, false);
    name.getClickable().setOnKeyPressed(e1->{
        if(e1.getCode() == KeyCode.ENTER) {
            username = name.getText();
            System.out.println(username);
            password = passField.getText();
            System.out.println(password);
            menu.showScene();
        }
    });

Но когда я делаю keylistener в этом классе, он переопределяет keylistener в классе Tetxfield и функции, которые яmake в Textfield не работает.И я хочу сделать постоянный keylistener в классе Textfield, и когда мне нужно будет добавить рядом с тем же действием keylistener, так что он добавляет из класса, где я создаю объект Textfield.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 21 марта 2019

addEventHandler позволяет добавить несколько обработчиков событий для типа события.

textField.addEventHandler(KeyEvent.KEY_PRESSED, e -> {
    if(textField.getCharacters().length() == 1){
        if(e.getCode() == KeyCode.DELETE){
            if(textField.getCaretPosition() == 0){
                label.setText(text);
            }
        }
        else if(e.getCode() == KeyCode.BACK_SPACE){
            if(textField.getCaretPosition() == 1){
                label.setText(text);
            }
        }

    }
    else if(textField.getCharacters().length() == 0 && (e.getText().length() > 0)){
        if(e.getCode() != KeyCode.TAB) {
            label.setText(" ");
        }
    }
    else if((textField.getSelectedText().length() == textField.getCharacters().length()) && ((e.getCode() == KeyCode.DELETE) || (e.getCode() == KeyCode.BACK_SPACE))){
        label.setText(text);
    }
});
...