Java label.setText NullPointerException
你好,第一次来这里,但这里有: 我有一个JavaFX应用程序,它可以动态更改FXMLUI标签,并且数据是从播放器类中提取的 这两个类是Java label.setText NullPointerException,java,nullpointerexception,javafx,fxml,settext,Java,Nullpointerexception,Javafx,Fxml,Settext,你好,第一次来这里,但这里有: 我有一个JavaFX应用程序,它可以动态更改FXMLUI标签,并且数据是从播放器类中提取的 这两个类是Player.java和InterfaceHandler.java player类存储player细节,我想将细节传递给接口类,接口类设置标签上的文本 作为测试,我的FXMLUI只有一个按钮和两个标签 如果单击按钮,则调用把手按钮方法,将位置标签设置为“Town”精细 然而,如果我在我的Player类中调用locationLabel()方法,当调用namelab.
Player.java
和InterfaceHandler.java
player类存储player细节,我想将细节传递给接口类,接口类设置标签上的文本
作为测试,我的FXMLUI只有一个按钮和两个标签
如果单击按钮,则调用把手按钮
方法,将位置标签
设置为“Town”精细
然而,如果我在我的Player类中调用locationLabel()
方法,当调用namelab.setText(name)
时,我会得到一个NullPointerException。通过调试,我发现接口类中的名称字符串应该是“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);
}
接口处理程序类:
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);
}
}
MainScreen.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文件中插入
标签
注释标签
变量。使用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是一个控制器,您可以在FXML中使用fx:controller
引用它。这指示FXMLLoader在加载程序加载其FXML时创建InterfaceHandler的新实例。因此,不要在您的Player类中创建新的InterfaceHandler,而是将InterfaceHandler作为Player的构造函数参数,并使用loader.getController从FXMLLoader中获取InterfaceHandler控制器实例
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);
}
}
我有一个类似的问题,但结果证明我已经将标签作为一个静态属性,当我删除静态部分时,它修复了nullpointer例外。谢谢,这是有效的!然而,我确实需要添加一个cast来使它工作:Player-Player=newplayer((InterfaceHandler)loader.getController())代码>如果使用NetBeans,请使用make controller选项从fxml创建控制器文件。它将为您进行FXML注射。