JavaFX - Getter 从 TextFields 数组中获取焦点 TextField

JavaFX - Getter for focused TextField out of an array of TextFields

我正在寻找一种在我的程序中预见 getter 的方法。我有一堆动态创建的 TextFields:

fields = new TextField[105];
for (int i = 0; i < fields.length; i++) {
    fields[i] = new TextField();
}

在我的程序中它看起来像这样:

GameView for the TextFields

本程序的objective是利用图片底部List中的单词,猜猜你要填入TextFields中的单词a.k.a。字母金字塔。因此,我想将聚焦的 TextField 文本与从文本文件读入我的程序的正确答案进行比较。我面临的问题是,我不知道如何从当前关注的数组中预见 getter return 的 TextField。有没有人可以帮助我?

提前致谢!

这里还有一些代码块可以帮助您理解我的问题:

这是我想要 return 聚焦的 TextField

的 getter
public TextField getField() {
    return theFocusedTextField;
}

将接收焦点字段并在我的 "model"-class.

中调用方法 checkInput() 的处理程序
view.getField().textProperty().addListener((observable, oldValue, newValue) -> {
        if (newValue.length() == 1) {
            Log.debug("Old value: " + oldValue + "\nNew value: " + newValue);
            boolean isCorrect = model.checkInput(newValue);
            if (isCorrect) {
                view.getField().setStyle("-fx-background-color: darkgreen; -fx-text-fill: white");
            } else {
                view.getField().setStyle("-fx-background-color: darkred; -fx-text-fill: white");
            }
        } else if (newValue.equals("")) {
            view.getField().setStyle("-fx-background-color: darkred; -fx-text-fill: white");
        }
    });

目前,它接收到我自己设置的预定义字段。检查答案的代码有效。感谢任何提供帮助的人,如果我自己找到方法,我一定会 post 在这里。

假设您已经定义:

private TextField theFocusedTextField ;

那么你只需要:

fields = new TextField[105];
for (int i = 0; i < fields.length; i++) {
    TextField textField = new TextField();
    fields[i] = textField ;
    textField.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
        if (isNowFocused) {
            theFocusedTextField = textField ;
        } else {
            theFocusedTextField = null ;
        }
    });
}

可以使用 focusOwner propertyScene 检索当前聚焦的 Node。您可以从与 TextField 属于同一场景的任何 Node 中获取 Scene

示例:

Scene scene = fields[0].getScene();
Node focusOwner = scene.getFocusOwner();
if (focusOwner instanceof TextField) {
     TextField focusedField = (TextField) focusOwner;
     ...
}

请注意,通过这种方式可以检索不在数组中的 TextField,因此在这种情况下,您可能需要检查一下,例如通过检查 parentstyleClasses,...(假设其中之一允许您确定这是否是数组中的 TextFields 之一)-