Java 无论发生什么情况,FXMLLoader.getController()都返回null
我一直在为我在JavaFX中的学习做一个小应用程序。在应用程序中,我需要将控制器与主文件分开,因此我设计了以下功能:Java 无论发生什么情况,FXMLLoader.getController()都返回null,java,javafx,Java,Javafx,我一直在为我在JavaFX中的学习做一个小应用程序。在应用程序中,我需要将控制器与主文件分开,因此我设计了以下功能: public class DiceObserver implements Observer { FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); public Controller controller = loader.<Controller>get
public class DiceObserver implements Observer {
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
public Controller controller = loader.<Controller>getController();
Dice ov;
public DiceObserver(Dice dice){
this.ov = dice;
}
public void update(Observable o, Object arg) {
int roll = ov.getLastValue().getRolledValue();
System.out.println(roll);
controller.updateBarChart(roll);
}
}
public类DiceObserver实现了Observer{
FXMLLoader=newFXMLLoader(getClass().getResource(“sample.fxml”);
public Controller=loader.getController();
Dice ov;
公众骰子观察者(骰子){
this.ov=骰子;
}
公共无效更新(可观察o,对象arg){
int roll=ov.getLastValue().getRolledValue();
系统输出打印项次(卷);
控制器.updateBarChart(滚动);
}
}
FXML文件:
package sample;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller{
@FXML public TextField freqText;
@FXML public Slider freqSlider;
@FXML public Button startButton;
@FXML public Button endButton;
@FXML public BarChart rollChart;
@FXML public ImageView dicePic;
XYChart.Series s1 = new XYChart.Series<>();
XYChart.Series s2 = new XYChart.Series<>();
XYChart.Series s3 = new XYChart.Series<>();
XYChart.Series s4 = new XYChart.Series<>();
XYChart.Series s5 = new XYChart.Series<>();
XYChart.Series s6 = new XYChart.Series<>();
Image side1 = new Image("Dice_Side_1.png");
SimulationThread t = SimulationThread.getInstance();
public void startSimulation(ActionEvent event) { // start the simulation
t.start();
}
public void getNewFreqValue(ActionEvent event) {
freqText.setText(String.valueOf(freqSlider.getValue()));
}
public void stopSimulation(ActionEvent event) {
t.end();
}
public void updateBarChart(int diceRoll){
System.out.println(diceRoll);
int rollval = diceRoll;
switch (rollval) {
case 1:
s1.getData().add(rollval);
break;
case 2:
s2.getData().add(rollval);
break;
case 3:
s3.getData().add(rollval);
break;
case 4:
s4.getData().add(rollval);
break;
case 5:
s5.getData().add(rollval);
break;
case 6:
s6.getData().add(rollval);
break;
}
}
public void updateDicePic(int diceRoll){
dicePic.setImage(side1);
}
public void initialize() {
}
}
包装样品;
导入javafx.event.ActionEvent;
导入javafx.fxml.fxml;
导入javafx.fxml.fxmloader;
导入javafx.fxml.Initializable;
导入javafx.scene.chart.BarChart;
导入javafx.scene.chart.XYChart;
导入javafx.scene.control.Button;
导入javafx.scene.control.Slider;
导入javafx.scene.control.TextField;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入java.io.IOException;
导入java.net.URL;
导入java.util.ResourceBundle;
公共类控制器{
@FXML公共文本字段freqText;
@FXML公共滑块;
@FXML公共按钮开始按钮;
@FXML公共按钮endButton;
@FXML公共条形图、滚动图;
@FXML公共图像视图;
XYChart.Series s1=新的XYChart.Series();
XYChart.Series s2=新的XYChart.Series();
XYChart.Series s3=新的XYChart.Series();
XYChart.Series s4=新的XYChart.Series();
XYChart.Series s5=新的XYChart.Series();
XYChart.Series s6=新的XYChart.Series();
Image side1=新图像(“Dice_Side_1.png”);
SimulationThread t=SimulationThread.getInstance();
public void启动模拟(ActionEvent事件){//启动模拟
t、 start();
}
public void getNewFreqValue(ActionEvent事件){
freqText.setText(String.valueOf(freqSlider.getValue());
}
公共void stopSimulation(ActionEvent事件){
t、 end();
}
公共void updateBarChart(整数骰子){
系统输出打印项次(骰子卷);
int rollval=掷骰子;
开关(rollval){
案例1:
s1.getData().add(rollval);
打破
案例2:
s2.getData().add(rollval);
打破
案例3:
s3.getData().add(rollval);
打破
案例4:
s4.getData().add(rollval);
打破
案例5:
s5.getData().add(rollval);
打破
案例6:
s6.getData().add(rollval);
打破
}
}
公共无效更新(整数掷骰){
dicePic.setImage(侧1);
}
公共无效初始化(){
}
}
updateBarChart
方法位于控制器中。当我运行代码时,加载程序有一个值,但是getcontroller
方法返回null。如何修复此问题?它返回null
,因为您尚未指定控制器。从上面发布的代码来看,控制器和FXML彼此都不知道
电话:
例如:
或者必须在FXML文档(根元素)中指定控制器:
它返回null
,因为您尚未指定控制器。从上面发布的代码来看,控制器和FXML彼此都不知道
电话:
例如:
或者必须在FXML文档(根元素)中指定控制器:
fxmloader=newfxmloader(getClass().getResource(“sample.fxml”);
public Controller=loader.getController();
您既不能设置控制器,也不能初始化fxml文件中指定的控制器类(fx:controller
属性),因为在使用getController()
之前不调用
我猜你是想做后者。但是,如果不实际加载fxml文件,则不会创建任何控制器。仅仅创建fxmloader
实例不会加载任何内容。调用load
方法时,将处理输入。(处理输入当然是了解并因此能够创建控制器实例的先决条件。)fxmloader=newfxmloader(getClass().getResource(“sample.fxml”);
public Controller=loader.getController();
您既不能设置控制器,也不能初始化fxml文件中指定的控制器类(fx:controller
属性),因为在使用getController()
之前不调用
我猜你是想做后者。但是,如果不实际加载fxml文件,则不会创建任何控制器。仅仅创建fxmloader
实例不会加载任何内容。调用load
方法时,将处理输入。(当然,处理输入是了解并因此能够创建控制器实例的先决条件。)
loader.setController(yourControllerInstance);
<AnchorPane maxHeight="...".... fx:controller="sample.Controller">
<HBox .... >
....
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
public Controller controller = loader.<Controller>getController();