2014-09-22 37 views
0

我在寫一個音樂播放器,並且無法將我的可觀察陣列與控制器中定義的TableView鏈接起來。當項目運行時,我得到NullPointerException在線評論。我不知道是什麼讓它發生,以及如何解決這個問題。JavaFX - 無法將控制器與數據陣列連接

Main.java

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.control.SplitPane; 
import javafx.stage.Stage; 


public class Main extends Application { 
    ObservableList<CModel> modelData = FXCollections.observableArrayList(); 


    @Override 
    public void start(Stage primaryStage) { 
     try { 
      FXMLLoader loader = new FXMLLoader(); 

      SplitPane root = FXMLLoader.load(getClass().getResource("Player.fxml")); 

      Scene scene = new Scene(root); 
      scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 

      primaryStage.setScene(scene); 

      PlayerController controller = loader.getController(); 

      //this line gives exception 
      controller.setData(this); 

      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public ObservableList<CModel> getPersonData() { 
     return modelData; 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

PlayerController.java

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.scene.control.Menu; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 

public class PlayerController { 

    @FXML 
    private TableView<CModel> cTable; 

    @FXML 
    private TableColumn<CModel, String> artCol; 

    @FXML 
    private TableColumn<CModel, String> albCol; 

    @FXML 
    private TableColumn<CModel, String> trNameCol; 

    @FXML 
    private TableColumn<CModel, String> trNoCol; 

    @FXML 
    private TableColumn<CModel, String> durCol; 

    @FXML 
    private Menu addFile; 

    @FXML 
    private Menu addFolder; 

    @FXML 
    private Menu savePlayL; 

    @FXML 
    private Menu loadPlayL; 


    private Files files; 



    private Main main; 

    public PlayerController() { 

    } 

    @FXML 
    private void initialize() { 
     artCol.setCellValueFactory(
       new PropertyValueFactory<CModel,String>("artistName") 
      ); 

     albCol.setCellValueFactory(
       new PropertyValueFactory<CModel,String>("albumName") 
      ); 

     trNameCol.setCellValueFactory(
       new PropertyValueFactory<CModel,String>("trackName") 
      ); 

     trNoCol.setCellValueFactory(
       new PropertyValueFactory<CModel,String>("trackDurationName") 
      ); 

     durCol.setCellValueFactory(
       new PropertyValueFactory<CModel,String>("trackNumberName") 
      ); 



    } 


    @FXML 
    protected void handleAddFile(ActionEvent event) { 
     files = new Files(); 
     files.openFile(); 
    } 

    public void setData(Main mainApp) { 
     this.main = mainApp; 

     cTable.setItems(main.getPersonData()); 
    } 

} 

回答

2

你需要調用實例化對象的loader.load()方法,而是採用靜態方法,讓控制器之前,採取詳情請看here

0

這裏有幾件事情需要考慮。爲了得到控制,你需要記住以下幾點:

  • 使用FXMLoader參考加載FXML
  • 調用非靜態load方法。爲了做到這一點,通過InputStream作爲參數。

Main.Java裏面,你應該有:

FXMLLoader loader = new FXMLLoader(); 
SplitPane root = (SplitPane)loader.load(getClass().getResource("Player.fxml").openStream()); 

如果你不想使用InputStream,你也可以通過資源在構造函數中,並調用非staic load()方法

FXMLLoader loader = new FXMLLoader(getClass().getResource("Player.fxml")); 
SplitPane root = (SplitPane)loader.load(); 
+0

我做了你寫的,它沒有幫助。仍然我得到空例外 – regularmike 2014-09-22 12:27:14

+0

我錯過了openStream,請再次檢查。如果我們不使用'InputStream'作爲參數,它仍然會引用靜態方法 – ItachiUchiha 2014-09-22 12:42:49

+0

現在,它的工作原理!謝謝,驚訝的是我在Oracle教程中找不到它,這是抓住javafx的一個非常重要的方面。 – regularmike 2014-09-22 17:08:34