Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无论发生什么情况,FXMLLoader.getController()都返回null_Java_Javafx - Fatal编程技术网

Java 无论发生什么情况,FXMLLoader.getController()都返回null

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

我一直在为我在JavaFX中的学习做一个小应用程序。在应用程序中,我需要将控制器与主文件分开,因此我设计了以下功能:

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();