2016-11-18 2 views
0

Я пытаюсь фильтровать и показывать количество элементов с помощью FX Tableview.Как определить размер подсчета элементов таблицы в JavaFx?

Есть некоторые кнопки и TXT поля для листинга spesific данных here is

ввод текста: фильтрация

ясно кнопка: Код gettingenter здесь значения по умолчанию

этой кнопка месяца: получать этот месяц значение

сборщик данных: для получения любых значений дня

Существует этикетка для показа табличных предметов размер

public Label lblRecordSize; 

Моя проблема; Я не хочу lblRecordSize.settext() под каждым действием для фильтрации. Есть ли слушатель как tableview.onItemSizeChangeListener() и т.д.

Обновлено:

public class CenterDbController implements Initializable { 

    public AnchorPane centerDbPanelPane; 

    /** */ 
    public TextField txtSerialNo; 
    public ComboBox<EModemModel> cbxModemModel; 
    public Label lblRecordSize; 
    public DatePicker dpStartDate; 
    public DatePicker dpEndDate; 
    public Button btnShow; 
    public Button btnClear; 

    /** */ 
    public TableView<RecordedTest> tblvRecords; 
    public TableColumn colRecordId; 
    public TableColumn colOfficeId; 
    public TableColumn colCompany; 
    public TableColumn colModemSerialNumber; 
    public TableColumn colModemBrand; 
    public TableColumn colModemModel; 
    public TableColumn colSoftwareVersion; 
    public TableColumn colAccessTest; 
    public TableColumn colSoftwareTest; 
    public TableColumn colDhcpTest; 
    public TableColumn colWifiTest; 
    public TableColumn colInternetTest; 
    public TableColumn colResetTest; 
    public TableColumn colTestResult; 
    public TableColumn colSendStatus; 
    public TableColumn colRecordDate; 
    public TableColumn colTestDetails; 

    /** */ 
    private IRecordedTestService recordedTestService; 
    private FilteredList<RecordedTest> filteredList; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 

     initCellFactories(); 

     recordedTestService = UtilsForSpring.getSingleBeanOfType(IRecordedTestService.class); 
     filteredList = new FilteredList<>(FXCollections.observableList(recordedTestService.getThisMonthRecords()), s -> true); 
     tblvRecords.setItems(filteredList); 
     lblRecordSize.textProperty().bind(Bindings.size(tblvRecords.getItems()).asString("%s")); 
//  lblRecordSize.setText(filteredList.size() + ""); 

     filteredList.addListener(new ListChangeListener<RecordedTest>() { 
      @Override 
      public void onChanged(Change<? extends RecordedTest> c) { 
//    lblRecordSize.setText(filteredList.size() + ""); 
      } 
     }); 


     cbxModemModel.getItems().addAll(EModemModel.values()); 


    } 


    private void initCellFactories() { 

     colRecordId.setCellValueFactory(new PropertyValueFactory<RecordedTest, String>("recordId")); 
     colOfficeId.setCellValueFactory(new PropertyValueFactory<>("officeId")); 
     colCompany.setCellValueFactory(new PropertyValueFactory<>("company")); 
     colModemSerialNumber.setCellValueFactory(new PropertyValueFactory<>("modemSerialNumber")); 
     colModemBrand.setCellValueFactory(new PropertyValueFactory<>("modemBrand")); 
     colModemModel.setCellValueFactory(new PropertyValueFactory<>("modemModel")); 
     colSoftwareVersion.setCellValueFactory(new PropertyValueFactory<>("softwareVersion")); 

     colAccessTest.setCellValueFactory(new PropertyValueFactory<>("accessTest")); 
     colSoftwareTest.setCellValueFactory(new PropertyValueFactory<>("softwareTest")); 
     colDhcpTest.setCellValueFactory(new PropertyValueFactory<>("dhcpTest")); 
     colWifiTest.setCellValueFactory(new PropertyValueFactory<>("wifiTest")); 
     colInternetTest.setCellValueFactory(new PropertyValueFactory<>("internetTest")); 
     colResetTest.setCellValueFactory(new PropertyValueFactory<>("resetTest")); 
     colTestResult.setCellValueFactory(new PropertyValueFactory<>("testResult")); 
     colSendStatus.setCellValueFactory(new PropertyValueFactory<>("sendStatus")); 

     colRecordDate.setCellValueFactory(new PropertyValueFactory<>("recordDate")); 
     colTestDetails.setCellValueFactory(new PropertyValueFactory<>("testDetails")); 

    } 

    public void btnClearOnClickAction(ActionEvent e) { 

     txtSerialNo.clear(); 
     cbxModemModel.getSelectionModel().clearSelection(); 
     dpEndDate.setValue(null); 
     dpStartDate.setValue(null); 

     filteredList = new FilteredList<>(FXCollections.observableList(recordedTestService.getThisMonthRecords()), s -> true); 
     tblvRecords.setItems(filteredList); 
//  lblRecordSize.setText(filteredList.size() + ""); 

    } 

    public void btnShowOnClickAction(ActionEvent e) { 

     if (dpStartDate.getValue() != null && dpEndDate != null) { 
      filteredList = new FilteredList<>(FXCollections.observableList(recordedTestService.getBetweenRecords(dpStartDate.getValue(), dpEndDate.getValue()))); 
      tblvRecords.setItems(filteredList); 
     } 
    } 


    public void tableOnSortListener() { 


//  lblRecordSize.setText(tblvRecords.getItems().size() + ""); 
    } 

    public void txtSerialNoOnKeyPress() { 

     txtSerialNo.textProperty().addListener(observable -> { 
      String filter = txtSerialNo.getText(); 
      if (filter == null || filter.length() == 0) { 
       filteredList.setPredicate(s -> true); 
      } else { 
       filteredList.setPredicate(s -> s.getModemSerialNumber().contains(filter)); 
      } 
     }); 
    } 

    public void cbxModemModelOnValueChange() { 

     String filter = cbxModemModel.getSelectionModel().getSelectedItem().toString(); 
     if (filter == null || filter.length() == 0) { 
      filteredList.setPredicate(s -> true); 
     } else { 
      filteredList.setPredicate(s -> s.getModemModel().equalsIgnoreCase(filter)); 
     } 
    } 

} 

ответ

0

Bindings class обеспечивает size метод, который позволяет создавать привязки для размера ObservableList. Предполагая, что вы изменить существующий список и не заменить его на новый каждый раз, когда вы фильтр (например, с помощью FilteredList), вы можете использовать это, чтобы связать Label текст:

// after assigning the items 
lblRecordSize.textProperty().bind(Bindings.size(tableview.getItems()).asString("Record count: %s")); 

Редактировать

В вашем коде вы заменяете список элементов. Prequesite из items не заменяется не дано ...

Вы можете добавить слушателя к свойству элемента, а и пересвяжите Label тексту каждый раз

// before setting items the first time 
tblvRecords.itemsProperty().addListener((observable, oldItems, newItems) -> 
              lblRecordSize.textProperty().bind(
                Bindings.size(newItems).asString())); 

Однако можно также изменить единый список чтобы содержать исходные данные, а не воссоздавать списки каждый раз:

private final ObservableList<RecordedTest> data = FXCollections.observableArrayList(); 
private final FilteredList<RecordedTest> filteredList = new FilteredList<>(data); 

@Override 
public void initialize(URL location, ResourceBundle resources) { 

    initCellFactories(); 

    recordedTestService = UtilsForSpring.getSingleBeanOfType(IRecordedTestService.class); 
    filteredList.setPredicate(null); 
    data.setAll(recordedTestService.getThisMonthRecords()); 
    tblvRecords.setItems(filteredList); 
    lblRecordSize.textProperty().bind(Bindings.size(filteredList).asString()); 
    ... 
} 

... 

public void btnClearOnClickAction(ActionEvent e) { 
    ... 

    filteredList.setPredicate(null); 
    data.setAll(recordedTestService.getThisMonthRecords())); 
} 
+0

спасибо, но не работает, когда я фильтрую значение. –

+0

@enes Вы заменяете свой список, и поэтому он не работает. если вы не выполняете или не слушаете изменения в свойстве 'items'' TableView' и не перегружаете свойство 'text'' Label' каждый раз, когда оно заменяется, оно должно работать; Отредактировал ответ. – fabian

+0

спасибо, это работа для меня! :) –