[英]FXMLLoader.getController() returns null no matter what
我一直在为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);
}
}
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() {
}
}
updateBarChart
方法位于控制器中。 当我运行代码时,加载器有一个值,但getcontroller
方法返回null。 我怎样才能解决这个问题?
它返回null
因为您尚未指定控制器。 从您上面发布的代码中,您的控制器和FXML彼此不了解。
呼叫:
loader.setController(yourControllerInstance);
例:
https://github.com/SnakeDoc/superD/blob/master/src/com/vanomaly/superd/Main.java#L39
或者您必须在FXML文档中指定控制器(在根元素中):
<AnchorPane maxHeight="...".... fx:controller="sample.Controller">
<HBox .... >
....
例:
https://github.com/SnakeDoc/Narvaro/blob/master/src/resources/Narvaro.fxml#L13
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
public Controller controller = loader.<Controller>getController();
既不设置控制器,也不能初始化fxml文件( fx:controller
属性)中指定的控制器类,因为在使用getController()
之前不调用load()
getController()
。
我想你正试图做后者。 但是,如果没有实际加载fxml文件,则不会创建任何控制器。 只是创建FXMLLoader
实例不会加载任何东西。 调用load
方法时会处理输入。 (处理输入当然是了解并因此能够创建控制器实例的先决条件。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.