2015-04-30 2 views
4

Я пытаюсь использовать текстовое поле для фильтрации через табличный вид, я хочу, чтобы текстовое поле (txtSearch) искало «nhs number», «first name», «last name», и «категория сортировки». Я попытался реализовать различные решения в Интернете и не повезло, но я все еще новичок во всем этом, поэтому извиняюсь, если это было спрошено плохо. любая помощь будет принята с благодарностью, мой код ниже.Отображение таблицы Java FX Filter

общественного класса QueueTabPageController реализует Initializable {

@FXML 
private TableView<Patient> tableView; 

@FXML 
private TableColumn<Patient, String> NHSNumberColumn; 

@FXML 
private TableColumn<Patient, String> firstNameColumn; 

@FXML 
private TableColumn<Patient, String> lastNameColumn; 

@FXML 
private TableColumn<Patient, String> timeEnteredColumn; 

@FXML 
private TableColumn<Patient, String> triageAssessmentColumn; 

@FXML 
private TextField filterField; 

@FXML 
private QueueTabPageController queueTabPageController; 

private ObservableList<Patient> tableData; 

// public static LinkedList<Patient> displayQueue; 


/** 
    * Initializes the controller class. This method is automatically called 
    * after the fxml file has been loaded. 
    * 
    * Initializes the table columns and sets up sorting and filtering. 
    */ 
    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 

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

     NHSNumberColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("nhsNumber")); 
     firstNameColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("firstName")); 
     lastNameColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("lastName")); 
     timeEnteredColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("timeEnteredString")); 
     triageAssessmentColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("triage")); 

     // display the current queue to screen when opening page each time 
     displayQueue(Queue.queue); 

     // 0. Initialize the columns. 
     //firstNameColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("firstName")); 
     //lastNameColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("lastName")); 

     // 1. Wrap the ObservableList in a FilteredList (initially display all 
     // data). 
     FilteredList<Patient> filteredData = new FilteredList<>(tableData, 
       p -> true); 

     // 2. Set the filter Predicate whenever the filter changes. 
     filterField.textProperty().addListener(
       (observable, oldValue, newValue) -> { 
        filteredData.setPredicate(Patient -> { 
         // If filter text is empty, display all persons. 
          if (newValue == null || newValue.isEmpty()) { 
           return true; 
          } 

          // Compare first name and last name of every person 
          // with filter text. 
          String lowerCaseFilter = newValue.toLowerCase(); 

          if (Patient.getFirstName().toLowerCase() 
            .contains(lowerCaseFilter)) { 
           return true; // Filter matches first name. 
          } else if (Patient.getLastName().toLowerCase() 
            .contains(lowerCaseFilter)) { 
           return true; // Filter matches last name. 
          } 
          return false; // Does not match. 
         }); 
       }); 

     // 3. Wrap the FilteredList in a SortedList. 
     SortedList<Patient> sortedData = new SortedList<>(filteredData); 

     // 4. Bind the SortedList comparator to the TableView comparator. 
     sortedData.comparatorProperty().bind(tableView.comparatorProperty()); 

     // 5. Add sorted (and filtered) data to the table. 
     tableView.setItems(sortedData); 

    } 

Я получаю сообщение об ошибке здесь (шаг 4):

(TableView.comparatorProperty()); 

и (шаг 5)

TableView.setItems(sortedData); 

говоря: Невозможно сделать статическую ссылку на нестатический метод setItems (ObservableList) из t он типа TableView

+0

«Я попытался реализовать различные решения в Интернете и не повезло». Пожалуйста, покажите, что вы попробовали, и объясните, что пошло не так. –

+0

@James_D Я в основном пробовал этот учебник: http://code.makery.ch/blog/javafx-8-tableview-sorting-filtering, но он просто не запускался, когда я вводил текстовое поле. – Davidaj

+0

Код в этом учебнике отлично подходит для меня. –

ответ

1

TableView Ваш определяется как:

@FXML 
private TableView<Patient> tableView; 

Так ....

Попробуйте поставить: (tableView.comparatorProperty());

вместо: (TableView.comparatorProperty());

и сделать то же самое с: TableView.setItems(sortedData);

Я рекомендую вам изменить tableView для других, отличных от TableView, что-то вроде patientTable!

Сообщите мне, если это работает!

+0

Исправлено, что без ошибок, но все же не стреляли, может быть, что таблица изначально пуста до тех пор, пока не будет добавлен пациент? так что он не заселен? Извините, новичок во всем этом. – Davidaj

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