2016-06-09 4 views
1

Я занимаюсь небольшим приложением для изучения в JavaFX. В приложении, мне нужно получить контроллер отдельно от основного файла, так что я придумал это:FXMLLoader.getController() возвращает null независимо от того, что

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. Как я могу это исправить?

ответ

0

Он возвращает 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

0
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml")); 
public Controller controller = loader.<Controller>getController(); 

Вы ни установить контроллер, не может класс контроллера, указанный в файле FXML (fx:controller атрибута) инициализируется, так как вы не звоните load() перед использованием getController().

Я думаю, вы пытаетесь сделать последнее. Однако, не загружая файл fxml, никакой контроллер не будет создан. Просто создание экземпляра FXMLLoader ничего не загрузит. Вход обрабатывается, когда вы вызываете метод load. (Обработка ввода, конечно, является обязательным условием для знания и, следовательно, создания экземпляра контроллера.)

Смежные вопросы