2015-04-05 134 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

相关问题