2016-06-09 49 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屬性)指定的控制器類被初始化,因爲你不叫在使用getController()之前使用load()

我想你試圖做後者。但是,如果沒有實際加載fxml文件,則不會創建控制器。只創建FXMLLoader實例不會加載任何內容。當您調用load方法時會處理輸入。 (處理輸入當然是瞭解並因此能夠創建控制器實例的先決條件。)