Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使我自己的文本字段成为永久的keylistener?JAVA_Java_Javafx_Keylistener - Fatal编程技术网

如何使我自己的文本字段成为永久的keylistener?JAVA

如何使我自己的文本字段成为永久的keylistener?JAVA,java,javafx,keylistener,Java,Javafx,Keylistener,我有问题,我试着寻找一些解决方案,但没有成功。我创建了自己的类文本字段 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){

我有问题,我试着寻找一些解决方案,但没有成功。我创建了自己的类文本字段

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时,它会覆盖Tetxfield类中的keylistener,并且我在Textfield中创建的函数不起作用。我想在类Textfield中创建永久的keylistener,当我需要在keylistener的相同操作旁边添加时,它会从类中添加,在那个里我创建了Textfield的对象

感谢您的帮助。

允许您为一个事件类型添加多个事件处理程序

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);
    }
});

不相关:最好不要将自定义类命名为与框架类相同的名称,尤其是当它们完全不相关时(因为您的TextField扩展了组),这迟早会让某些人(包括您自己)感到困惑:)谢谢,这正是我要找的。