2015-11-01 77 views
0

我想創建顯示不同內容作爲tableview的選項卡。但是,它僅顯示每個選項卡中沒有列和內容的表格。這裏是相關的代碼。是創建該表Javafx,無法顯示tableview內容到不同的選項卡?

@Override 
public void start(Stage primaryStage) { 
    this.primaryStage = primaryStage; 
    this.primaryStage.setTitle(WINDOW_TITLE); 
    showWindow(); 
} 

public void showWindow() { 
    try { 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(UserInterface.class.getResource(MAIN_WINDOW_LAYOUT)); 
     AnchorPane page = (AnchorPane) loader.load(); 
     Scene scene = new Scene(page); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* Returns the main stage. 
* 
* @return primaryStage 
*/ 
public Stage getPrimaryStage() { 
    return primaryStage; 
} 

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

表類

/** 
* Creates a Task Table to display tasks 
* 
*/ 
protected TaskTable(ArrayList<Tasks> taskListToDisplay) { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource(LOCATION_TASK_TABLE_FXML)); 
    loader.setController(this); // Required due to different package declaration from Main 
    setTable(taskListToDisplay); 
    indexCol.getStyleClass().add("align-center"); 
    timeCol.getStyleClass().add("align-right"); 
    indexCol.setCellValueFactory(new PropertyValueFactory<>("index")); 
    descriptionCol.setCellValueFactory(new PropertyValueFactory<>("description")); 
    timeCol.setCellValueFactory(new PropertyValueFactory<>("time")); 
    table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

} 


/** 
* Create task table to display 
*/ 
public ObservableList<TaskModel> getTaskList(ArrayList<Tasks> currentList) { 
    ObservableList<TaskModel> taskData = FXCollections.observableArrayList(); 
    DateDisplay display = new DateDisplay(); 

    for (int i = 0; i < currentList.size(); i++) { 
     Tasks currentTask = currentList.get(i); 
     taskData.add(new TaskModel(i + 1, currentTask.getDescription(), 
       display.getDurationString(currentTask))); 
    } 
    return taskData; 
} 

public Node getTaskTable(){ 
    return this.taskTable; 
} 

public TableView getTable(){ 
    return this.table; 
} 

public void setTable(ArrayList<Tasks> taskList){ 
    table.setItems(getTaskList(taskList)); 
} 

public void setObservableTable(ObservableList taskList) { 
    table.getItems().setAll(taskList); 
} 

而且TabHandler

// ----------------------------------------- 
    // FXML variables 
    // ----------------------------------------- 
    @FXML 
    private TextField userCommand; 
    @FXML 
    private Label feedback; 
    @FXML 
    private Tab toDoTab; 
    @FXML 
    private Tab completedTab; 
    @FXML 
    private TabPane tabPane; 
    @FXML 
    private TaskTable toDoTaskTable = new TaskTable(); 
    @FXML 
    private TaskTable completedTaskTable = new TaskTable(); 

    // ----------------------------------------- 
    // Class variables 
    // ----------------------------------------- 
    private ArrayList<Tasks> currentToDoList = new ArrayList<Tasks>(); 
    private ArrayList<Tasks> currentCompletedList = new ArrayList<Tasks>(); 


    // ------------------------------------------------------- 
    // Message String 
    // ------------------------------------------------------- 

    private static final String PROMPT_USERCOMMAND_TEXT = "Enter command"; 
    private static final String PROMPT_USERCOMMAND_CLEAR = ""; 


    @FXML 
    private void initialize() throws Exception { 
       initGUI(); 
       handleUserInput(); 
    } 

    public void handleUserInput() { 
     userCommand.setOnKeyPressed(e -> { 
      if (e.getCode().equals(KeyCode.ENTER)) { 
       String userInput = userCommand.getText(); 
       FeedbackMessage output; 
       try { 
        output = getOutputFromLogic(userInput); 

        currentToDoList = output.getIncompleteTaskList(); 
        currentCompletedList = output.getCompleteTaskList(); 

        toDoTaskTable = new TaskTable(currentToDoList); 
        completedTaskTable = new TaskTable(currentCompletedList); 

        toDoTab.setContent(toDoTaskTable.getTable()); 
        completedTab.setContent(completedTaskTable.getTable()); 

        feedback.setText(output.getFeedback()); 
       } catch (Exception e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      } 


     }); 
    } 

    public void initGUI() { 
      toDoTaskTable.setTable(currentToDoList); 
      completedTaskTable.setTable(currentCompletedList); 
      toDoTab.setContent(toDoTaskTable.getTableView()); 
      completedTab.setContent(completedTaskTable.getTableView()); 
    } 
+0

「TaskTable」構造函數中的'FXMLLoader'應該做什麼?你似乎永遠不會調用'load()'。 「由於來自Main的不同包裝聲明」是什麼意思?你能擺脫冗餘代碼(只有你需要重現問題)並添加足夠的代碼,因此它是一個完整的例子(即把你的例子變成一個[MCVE])。 –

回答

0

你不應該這樣做:你爲什麼標註

@FXML 
private TaskTable toDoTaskTable = new TaskTable(); 

是有原因的該字段與@FXML,當你的FXML被加載時,這個字段將被所有其他字段實例化。

如果使用關鍵字new重新實例化原始控件的引用將丟失(該控件應該位於FXML中)。當您在新創建的實例上調用setTable時,您正在將數據添加到該對象中,該對象與FXML上顯示的對象無關,因此它總是顯示爲空。

我猜(從你提出你的問題的方式,我應該猜對)TaskTable是一個自定義組件。如果是,那麼您可以輕鬆地將自定義組件導入到場景構建器中。有questions and answers可以幫助你。

從上面的代碼中刪除new TaskTable()並修復其他問題後,您的代碼就應該開始了。

相關問題