gpt4 book ai didi

label - JavaFX - 标签 - 如何访问类成员

转载 作者:行者123 更新时间:2023-12-04 18:11:48 25 4
gpt4 key购买 nike

所以我的问题很简单。当他们是 String 时,我可以访问单独类中的类成员而不是 Label ,但我似乎不能,当它们是 Label .使用 JDK 7u6(带 JavaFX 2.2)。

简单的例子。第一个有效,第二个无效。 foo.label可以在第一个示例中分配,但我在第二个示例中得到一个 NullPointer。谁能解释为什么foo.label在下面的第二个示例中为 null 吗?

更新:我从原始问题中删除了 @FXML 注释,因为我认为它们对于我遇到的问题不是必需的。另外,请参阅我对 answer by @jewelsea 的评论...最后,为了完整起见,我添加了我的 FXML 文件(在 Q 的底部)。

这有效:

// Example 1:
public class SampleController implements Initializable {
Foo foo = new Foo();

public void handleButtonAction(ActionEvent event) {
System.out.println("You clicked me!");
foo.label = "Hello World!";
System.out.println(foo.label);
}

@Override public void initialize(URL url, ResourceBundle rb) {
}
}

// Example 1 -- Foo.java:
public class Foo {
public String label;
}

这不起作用:
// Example 2:
public class SampleController implements Initializable {
Foo foo = new Foo();

public void handleButtonAction(ActionEvent event) {
System.out.println("You clicked me!");
foo.label.setText("Hello World!"); // gives NullPointer exception !!
}

@Override public void initialize(URL url, ResourceBundle rb) {
}
}

// Example 2 -- Foo.java:
import javafx.scene.control.Label;

public class Foo {
public Label label;
}

这是我的 FXML 文件,用于上述任一示例:
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml" fx:controller="javafxapplication4.SampleController">
<children>
<Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
<Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" text="hey!" />
</children>
</AnchorPane>

最佳答案

在您的第二个示例中,您永远不会将 foo 标签初始化为任何内容,因此它将保持为空。

您确实使用 Foo foo = new Foo(); 创建了一个 Foo 对象但这不会初始化 Foo 内部的标签字段成员。特别是,@FXML 注释不会以您在提供的代码中使用它的方式做任何事情。这是因为 Foo 不是 Controller 。

允许您的示例运行的一些方法:

1. 摆脱 Foo

  • 移动@FXML public Label label;进入您的SampleController .
  • 摆脱Foo类并确保您的 fxml 定义了 fx:id="label" .

  • 2. 在 SampleController 中初始化 Foo 标签
  • 将以下代码放入示例 Controller 的初始化方法中:foo.label = new Label(); .
  • 此外,在初始化时,将 foo 标签添加到某个容器(例如布局 Pane )中,以便它可见。

  • 3. 使 Foo 成为嵌套 Controller
  • 保留 Foo 类。
  • 使用 @FXML Foo foo; 初始化 Controller 中的 Foo 实例而不是 Foo foo = new Foo(); .
  • 使 Foo 类成为 Controller (实现 Initializable 或定义具有适当签名的初始化方法)。
  • 在您引用 SampleController 的 fxml 中, 还有一个 fx:include用于设置 fx:id="label" 的新 foo.xml 文档的语句允许初始化 Foo 实例。

  • 第三种方式似乎最接近您想要的,它的文档位于 Nested Controllers FXML 文档简介部分。

    注意:这个问题更多的是关于如何使用@FXML 初始化类的成员,然后是如何访问类成员。访问只是通过普通的 getter/setter 或成员字段访问,就像您在示例中已经拥有的那样。

    您的第一个示例有效,因为您在使用之前明确地将 foo.label 初始化为新字符串(使用 foo.label = "Hello World!"; )。

    关于label - JavaFX - 标签 - 如何访问类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468525/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com