2014-09-22 2 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

Я сделал то, что вы написали, и это не помогло. Тем не менее я получаю исключение null – regularmike

+0

Я пропустил openStream, пожалуйста, проверьте его снова. Если мы не используем 'InputStream' в качестве параметра, он все равно будет ссылаться на статический метод – ItachiUchiha

+0

Теперь он работает! Спасибо, Увы, что я не мог найти его в учебниках Oracle, это довольно важный аспект захвата на javafx. – regularmike

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