当前位置: 首页 > 知识库问答 >
问题:

JavaFX FXML访问通过lookup()方法成功,但不能通过@FXML注释成功

徐安康
2023-03-14

我开始探索JavaFX FXML应用程序技术。

@Override
public void start(Stage stage) throws Exception {
    STAGE = stage;
    LOGIN = new Scene(FXMLLoader.load(getClass().getResource("Login.fxml")));
    REGISTER = new Scene(FXMLLoader.load(getClass().getResource("Register.fxml")));

    STAGE.setScene(LOGIN);
    STAGE.setTitle("FXApplication");
    STAGE.show();
}

public static Stage getStage() {
    return STAGE;
}
    null

并且两者具有相同的onclickeventhandleButtonAction(ActionEvent event)。TextFields是用于登录/注册用户名的字段。

@FXML private Button buttonLoginRegister;
@FXML private Button buttonRegisterBack;
@FXML private TextField fieldLoginUsername;
@FXML private TextField fieldRegisterUsername;

@FXML
private void handleButtonAction(ActionEvent event) throws IOException {

    Stage stage = Main.getStage();

    if (event.getSource() == buttonLoginRegister) {     
        stage.setScene(Main.REGISTER);
        stage.show();

        // Setting the text, the working way
        TextField node = (TextField) stage.getScene().lookup("#fieldRegisterUsername");
        node.setText(fieldLoginUsername.getText());

        // Setting the text, the erroneous way
        // fieldRegisterUsername.setText(fieldLoginUsername.getText());

    } else {
        stage.setScene(Main.LOGIN);
        stage.show();
    }
}

我的目标是将loginTextField中的值复制到Register场景中的值。使用上面的代码可以很好地工作。然而,首先,我尝试用以下方法访问另一个场景中的元素:

fieldRegisterUsername.setText(fieldLoginUsername.getText());

而且是错误的。确切地说,FieldRegisterUserNamenull

为什么有些元素是用lookup(String id)方法找到的,而不是用@fxml注释找到的?

共有1个答案

端木弘方
2023-03-14

正如我在评论中提到的,在不同的视图之间共享一个控制器很少是一个好主意,我强烈建议您为每个视图创建一个单独的控制器。

至于问题本身--控制器类有两个实例,每次调用fxmlloader.load时一个实例。假设一个视图具有FieldLoginUsernameTextField,而另一个视图具有FieldRegisterUsername.
如果满足If语句的条件,则意味着活动场景是登录场景,因此处理它的控制器是具有FieldLoginUsername的控制器,因此FieldRegisterUsername的控制器,因此FieldRegisterUsername自然为空。

但是在if子句的第一行,您将活动场景更改为Register场景,因此在调用scene#lookup时,您引用的场景的控制器是Register控制器,也就是具有FieldRegisterUserName的场景。

如果在更改活动场景之前调用scene#lookup,您会发现它也返回null。

如果必须将同一个类用于controller,则可能需要确保只有该类的一个实例。这就需要使用FXMLLoader#SetController

 类似资料:
  • 问题内容: 最初一切正常,我有一个类似的组件。这个 在其他档案中 到这里为止一切正常,但是当我在 它不起作用。我已经从react-redux导入了connect 问题答案: 接受为第四参数。在此选项参数中,您可以将flag设置为true。之后,您可以使用like 来访问ref的函数

  • 问题内容: 这是一个测试类: 这是我的输出: 我缺少通过反射使注释可见的什么? 我是否仅需要检查它们的存在就需要注释处理器? 问题答案: 为了在运行时访问注释,它需要具有运行时的保留策略。 否则,注释将被丢弃,并且JVM无法识别它们。 有关更多信息,请参见此处。

  • 问题内容: 是否可以通过注释处理器访问带有注释的元素? 是否可以通过注释处理器访问带注释的类型边界? 高度赞赏我错过的相关文档的链接。 内容: 注释: 一个示例类: 处理器: 在classpath 上使用编译以上内容将显示消息,但永远不会调用该方法。当方法参数中存在注释时,使用注释向处理器添加另一个注释可以正常工作。如果方法参数带有注释,则过程将再次忽略该元素。 问题答案: 该注释是有点棘手,因为

  • 我有一个带有Web触发器endpoint的Azure函数设置,我想将其用作React应用程序的后端。没有身份验证设置,它工作正常。当我使用AD设置应用服务身份验证时,当我直接通过浏览器访问时(身份验证后),它工作正常,但当我尝试从提供承载令牌的JS访问时,我得到了401。 客户端应用程序正在Azure上运行,并已注册为Azure AD应用程序。我能够成功地验证、查询AD和使用MS Graph AP

  • 问题内容: 通常,在面向对象的范例中,静态方法只能访问静态变量和静态方法。如果是这样,那么就会出现一个明显的问题,即Java中的main()方法如何才能访问非静态成员(变量或方法),即使它特别是公共静态void … !!! 问题答案: main方法也无权访问非静态成员。

  • 要 动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getMethods() getMethods(String name,Class<?> …parameterTypes) getDeclaredMethods() getDeclaredMethods(String name,Class<?>...parameterTypes) 如果是访问指定的构造方法,需要