2015-04-05 181 views
2

我在使用ObservableList中獲取的數據填充JavaFX中的表視圖時遇到困難。JavaFX tableView未填充ObservableList中的數據

當在PatientInfoController中按下btnConfirm()時,它會使用來自PatientInfoController視圖的屏幕文本數據創建一個Patient對象。

然後將該對象添加到Queue類的LinkedList隊列中。 隊列,然後返回並傳遞給QueueTabPageController方法displayQueue()

我知道病人的物體獲得所需的信息時,我打印了增強的for循環來安慰......

for (Patient patient : queue) { 
     System.out.println(patient.getFirstName()); 
     System.out.println(patient.getLastName()); 
     System.out.println(patient.getPostCode()); 
     System.out.println(patient.getTriage()); 
     tableData.add(patient); 
     System.out.println(tableData); 
    } 

但tableView不顯示單元格中的數據。

(我設法得到另一個tableview中從數據庫搜索結果填充,但我難倒就這一個)

任何指導,將不勝感激。 謝謝。

package controllers; 

import java.io.IOException; 
import java.net.URL; 
import java.util.List; 
import java.util.ResourceBundle; 

import app.Patient; 
import app.Queue; 
import app.Status; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.Node; 
import javafx.scene.control.Label; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.stage.Stage; 

public class PatientInfoController implements Initializable { 

    @FXML 
    private TableView<Patient> personTable; 
    @FXML 
    private TableColumn<Patient, String> firstNameColumn; 
    @FXML 
    private TableColumn<Patient, String> lastNameColumn; 

    @FXML 
    private Label nhsNumberLabel; 
    @FXML 
    private Label titleLabel; 
    @FXML 
    private Label firstNameLabel; 
    @FXML 
    private Label lastNameLabel; 
    @FXML 
    private Label streetNumberLabel; 
    @FXML 
    private Label streetNameLabel; 
    @FXML 
    private Label cityLabel; 
    @FXML 
    private Label postCodeLabel; 

    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
     assert personTable != null : "fx:id=\"tableView\" was not injected: check your FXML file 'PatientInfoPage.fxml'"; 
    } 

    /** 
    * Button to send user back to receptionist homepage 
    * 
    * @param event 
    * @throws IOException 
    */ 
    @FXML 
    private void btnCancel(ActionEvent event) throws IOException { 
     Stage stage = (Stage) ((Node) (event.getSource())).getScene().getWindow(); 
     stage.close(); 
    } 

    public static List<Patient> queue; 

    public static QueueTabPageController queueTabPageController; 

    /** 
    * Button to confirm patient and send them to triage/waiting queue 
    * 
    * @param event 
    */ 
    @FXML 
    private void btnConfirm(ActionEvent event) { 
     Stage stage = (Stage) ((Node) (event.getSource())).getScene().getWindow(); 
     // patientservicesclass psc = new patientservicesclass 

     // test.enqueue("test"); 
     // psc.getPatientById(nhsNumberLabel.getText()) 
     Patient p = new Patient(firstNameLabel.getText(), lastNameLabel.getText(), nhsNumberLabel.getText(), 
       titleLabel.getText(), streetNumberLabel.getText(), streetNameLabel.getText(), cityLabel.getText(), 
       postCodeLabel.getText(), Status.EMERGENCY); 

     queueTabPageController = new QueueTabPageController(); 

     queue = Queue.addToQueue(p); 

     queueTabPageController.displayQueue(queue); 

     stage.close(); 
    } 

    /** 
    * sets relevant labels to patient information from the database these 
    * labels are set before screen is changed --- see btnPatientInfo on the 
    * ReceptionistHomePageController for more info --- 
    * 
    * @param patient 
    */ 
    public void setPatientInfo(Patient patient) { 
     nhsNumberLabel.setText(patient.getNhsNumber()); 
     titleLabel.setText(patient.getTitle()); 
     firstNameLabel.setText(patient.getFirstName()); 
     lastNameLabel.setText(patient.getLastName()); 
     streetNumberLabel.setText(patient.getStreetNumber()); 
     streetNameLabel.setText(patient.getStreetName()); 
     cityLabel.setText(patient.getCity()); 
     postCodeLabel.setText(patient.getPostCode()); 

    } 

} 

package app; 

import java.util.LinkedList; 
import java.util.List; 

public class Queue implements Comparable<Patient> { 

    /** 
    * linked list of patient objects to represent queue 
    */ 
    public static List<Patient> queue = new LinkedList<Patient>(); 

    /** 
    * method to add a patient to the queue 
    * 
    * @param p 
    */ 
    public static List<Patient> addToQueue(Patient p) { 

     // check to see if queue is full 
     if (queue.size() < 10) { 
      // add patient if there is room in queue 
      queue.add(p); 
     } else { 
      // queue may be full 
      System.out.println("Queue is full"); 
      // alert on call team and hospital manager 
     } 

     return queue; 
     //test.displayQueue(queue); 
    } 

    /** 
    * method to remove a patient from the queue 
    * 
    * @param p 
    */ 
    public static void removefromQueue(Patient p) { 

     // remove patient from queue 
     queue.remove(p); 
    } 

    /** 
    * overriden method to allow comparison by triage status 
    */ 
    @Override 
    public int compareTo(Patient o) { 
     return 0; 
    } 

} 

package controllers; 

import java.net.URL; 
import java.util.List; 
import java.util.ResourceBundle; 

import app.Patient; 
import javafx.application.Platform; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 

public class QueueTabPageController implements Initializable { 

    @FXML 
    private TableView<Patient> tableView = new TableView<Patient>(); 

    @FXML 
    private TableColumn<Patient, String> firstNameColumn; 

    @FXML 
    private TableColumn<Patient, String> lastNameColumn; 

    @FXML 
    private TableColumn<Patient, String> postCodeColumn; 

    private ObservableList<Patient> tableData; 

    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 

     assert tableView != null : "fx:id=\"tableView\" was not injected: check your FXML file 'FXMLQueueTabPage.fxml'"; 

     firstNameColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("firstName")); 
     lastNameColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("lastName")); 
     postCodeColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("postCode")); 

    } 


    public void displayQueue(List<Patient> queue) { 

     tableData = FXCollections.observableArrayList(); 

     System.out.println("Starting display queue method in qtc + value of firstNameColumn = " + firstNameColumn); 

     for (Patient patient : queue) { 
      System.out.println(patient.getFirstName()); 
      System.out.println(patient.getLastName()); 
      System.out.println(patient.getPostCode()); 
      System.out.println(patient.getTriage()); 
      // tableData.addAll(queue); 
      tableData.add(patient); 
      System.out.println(tableData); 
     } 

     tableView.setItems(tableData); 
     refreshTable(); 

    } 

    void refreshTable() { 
     final List<Patient> items = tableView.getItems(); 
     if(items == null || items.size() == 0) return; 

     final Patient item = tableView.getItems().get(0); 
     items.remove(0); 
     Platform.runLater(new Runnable(){ 
      @Override 
      public void run() { 
       items.add(0, item); 
      } 
     }); 
    } 
} 

<?import javafx.scene.shape.*?> 
<?import javafx.scene.text.*?> 
<?import javafx.scene.control.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.AnchorPane?> 

<AnchorPane prefHeight="770.0" prefWidth="1000.0" stylesheets="@../styles/QueueTabPage.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.QueueTabPageController"> 
    <children> 
     <Rectangle arcHeight="5.0" arcWidth="5.0" fill="#517da6" height="156.0" stroke="BLACK" strokeType="INSIDE" styleClass="rectangle-pane" width="1065.0" /> 
     <Label layoutX="349.0" layoutY="62.0" styleClass="label-queueTitle" stylesheets="@../styles/QueueTabPage.css" text="Accident &amp; Emergency Queue"> 
     <font> 
      <Font size="30.0" /> 
     </font> 
     </Label> 
     <TableView fx:id="tableView" layoutX="242.0" layoutY="276.0" prefHeight="384.0" prefWidth="718.0"> 
     <columns> 
      <TableColumn fx:id="firstNameColumn" prefWidth="122.0" text="First name" /> 
      <TableColumn fx:id="lastNameColumn" prefWidth="144.0" text="Last name" /> 
      <TableColumn fx:id="postCodeColumn" prefWidth="158.0" text="Time waiting" /> 
     </columns> 
     </TableView> 
    </children> 
</AnchorPane> 
+0

由於您正在處理'@ fxml',因此您不必在'public class QueueTabPageController'中使用'private TableView tableView = new TableView ();'。這可以只是'私人TableView tableView;'因爲那部分被處理在'.fxml'文件中。 – WonderWorld 2015-04-05 11:48:36

回答

0

Basicly發生的事情是,TableView被填充,也畫,但因爲這行:private TableView<Patient> tableView = new TableView<Patient>();另一個空TableView被畫了它。如果更改

@FXML 
private TableView<Patient> tableView = new TableView<Patient>(); 

@FXML 
private TableView<Patient> tableView; 

你應該看到填充tableView

+0

我認爲你在那裏做着同樣的事情。你實例化'queueTabPageController = new QueueTabPageController();'控制器。我不是100%確定,但我認爲你不必這樣做。 – WonderWorld 2015-04-05 12:18:18

+0

當我更改該行時,我現在得到以下NullPointerException錯誤:'controllers.PatientInfoController.btnConfirm(PatientInfoController.java:87)'controllers.QueueTabPageController.displayQueue(QueueTabPageController.java:80)處的java.lang.NullPointerException''我嘗試過進行調試,但我不確定要做什麼,因爲我是Java和JavaFX的新手。還有什麼看起來可能不對嗎? – KvnH 2015-04-05 12:19:49

+0

如果您不確定要做什麼,我會建議您閱讀http://docs.oracle.com/javafx/2/fxml_get_started/jfxpub-fxml_get_started.htm以瞭解有關什麼和不該做的事情。我認爲'queueTabPageController = new QueueTabPageController();''queueTabPageController.displayQueue(queue);'可以以不同的方式處理。因爲控制器都是關於'fxml'的,顯示方法不涉及'fxml',因此您可能應該將'display'方法移動到另一個或新的類。 – WonderWorld 2015-04-05 12:39:37

相關問題