gpt4 book ai didi

java - label.setText 空指针异常

转载 作者:搜寻专家 更新时间:2023-11-01 03:05:55 24 4
gpt4 key购买 nike

大家好,第一次来这里:

我有一个 JavaFX 应用程序可以动态更改 FXML UI 标签,并且数据是从 Player 类中提取的。

有问题的两个类是 Player.javaInterfaceHandler.java

播放器类存储播放器详细信息,我想将详细信息传递给在标签上设置文本的接口(interface)类。

作为测试,我的 FXML UI 只有一个按钮和两个标签。

如果单击按钮,它会调用 handleButton 方法,并将 locationLabel 设置为“Town”。

但是,如果我在我的 Player 类中调用 locationLabel() 方法,我会在调用 nameLabel.setText(name) 时收到 NullPointerException。通过调试发现Interface类中的name字符串应该是“Dan”。

有人能帮忙吗?

主类:

public class Main extends Application {

public void start(final Stage mainStage) throws Exception {

Parent root = FXMLLoader.load(getClass().getResource("MainScreen.fxml"));
Scene scene = new Scene(root);
mainStage.setTitle("Main Screen");
mainStage.setScene(scene);
mainStage.show();
}

public static void main(String[] args) {
launch(args);
}
}

玩家类:

public class Player{

InterfaceHandler ui = new InterfaceHandler();

public void setNameLabel() {

String name = "Dan";
ui.setName(name);
}

接口(interface)处理类:

    public class InterfaceHandler implements Initializable {

public Label nameLabel;
public Label locationLabel;

public void handleButton(ActionEvent event) throws IOException {

locationLabel.setText("Town");
}

public void setName(String name){
nameLabel.setText(name);
}
}

主屏幕.fxml:

 <?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.effect.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<AnchorPane id="AnchorPane" prefHeight="629.0" prefWidth="600.0" snapToPixel="true" style="-fx-background-color: beige;" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="application.InterfaceHandler">
<children>
<Button fx:id="button1" layoutX="512.0" layoutY="381.0" minWidth="14.0" mnemonicParsing="false" onAction="#handleButton" prefHeight="30.0" prefWidth="51.0" text="Town" visible="true" />

<Label fx:id="nameLabel" layoutX="57.0" layoutY="8.0" prefWidth="216.0" text="blank" />
<Label fx:id="locationLabel" layoutX="68.0" layoutY="27.0" prefWidth="193.0" text="blank" />
</children>
</AnchorPane>

最佳答案

这是因为你没有从 FXML 文件中正确地注入(inject)你的 Labels

注释您的 Label 变量。使用 FXML 注释:

public class InterfaceHandler implements Initializable {
@FXML
public Label nameLabel;
@FXML
public Label locationLabel;

public void handleButton(ActionEvent event) throws IOException {
locationLabel.setText("Town");
}

public void setName(String name){
nameLabel.setText(name);
}
}

此外,InterfaceHandler 是一个 Controller ,您可以在 FXML 中使用 fx:controller 引用它。这指示 FXMLLoader 在加载程序加载其 FXML 时创建 InterfaceHandler 的新实例。因此,不要在您的 Player 类中创建新的 InterfaceHandler,而是使 InterfaceHandler 成为 Player 的构造函数参数,并使用 loader.getController 从 FXMLLoader 中获取 InterfaceHandler Controller 实例。

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("MainScreen.fxml"));
Parent root = (Parent)loader.load();
Player player = new Player(loader.getController());
Scene scene = new Scene(root);

. . .

public class Player {
private InterfaceHandler ui;

public Player(InterfaceHandler ui) {
this.ui = ui;
}

public void setNameLabel() {
String name = "Dan";
ui.setName(name);
}
}

关于java - label.setText 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22546028/

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