使用ListProperty绑定对TableView进行排序

时间:2016-09-04 19:24:47

标签: javafx-8

this code.makery博客,我能够理解tableview排序和过滤的工作原理和实现方式。问题是博客显示了一个不使用ListProperty的示例。当我尝试使用ListProperty更改代码示例时,不会进行排序和过滤。

这是博客提供的内容

    FilteredList<Person> filteredData = new FilteredList<>(masterData, p -> true);
    filterField.textProperty().addListener((observable, oldValue, newValue) -> {
        filteredData.setPredicate(person -> {

            if (newValue == null || newValue.isEmpty()) {
                return true;
            }
            String lowerCaseFilter = newValue.toLowerCase();

            if (person.getFirstName().toLowerCase().contains(lowerCaseFilter)) {
                return true;
            } else if (person.getLastName().toLowerCase().contains(lowerCaseFilter)) {
                return true;
            }
            return false;
        });
    }); 
    SortedList<Person> sortedData = new SortedList<>(filteredData);sortedData.comparatorProperty().bind(personTable.comparatorProperty());
    personTable.setItems(sortedData);

SSCCE

实施我的ListProperty
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.FloatProperty;
import javafx.beans.property.ListProperty;
import javafx.beans.property.ReadOnlyFloatProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleFloatProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.collections.transformation.SortedList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class SortTable  extends Application{
private ObservableList<Collection> collectionList = FXCollections.observableArrayList();
private ListProperty<Collection> collectionListProperty = new SimpleListProperty<>();

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

@Override
public void start(Stage primaryStage) throws Exception {
    BorderPane borderPane = new BorderPane();
    collectionList.setAll(getCollection());

    TableView<Collection> tv = new TableView();
    TextField sortTF = new TextField();

    TableColumn<Collection, Number> colAmount = createAmountColumn();
    TableColumn<Collection, String> colMno = createMNOColumn();
    TableColumn<Collection, Number> colPrice = createPriceColumn();
    TableColumn<Collection, Number> colQty = createQuantityColumn();

    tv.getColumns().addAll(colMno, colQty, colPrice, colAmount);

    collectionListProperty.set(collectionList);
    tv.itemsProperty().bind(collectionListProperty);

    FilteredList<Collection> filteredData = new FilteredList<>(collectionList, p -> true);
    sortTF.textProperty().addListener((observable, oldValue, newValue) -> {
        filteredData.setPredicate(SaleTransaction -> {
            if (newValue == null || newValue.isEmpty()) {
                return true;
            }
            String lowerCaseFilter = newValue.toLowerCase();
            if (SaleTransaction.getMno().toLowerCase().contains(lowerCaseFilter)) {
                return true; 
            }

            return false;
        });

    });
    SortedList<Collection> sortedData = new SortedList<>(filteredData);
    sortedData.comparatorProperty().bind(tv.comparatorProperty());
    collectionList.setAll(sortedData);

    borderPane.setTop(sortTF);
    borderPane.setCenter(tv);
    Scene scene = new Scene(borderPane, 600, 400);
    primaryStage.setScene(scene);
    primaryStage.show();
}

private TableColumn createQuantityColumn() {
    TableColumn<Collection, Float> colQty = new TableColumn("Quantity");
    colQty.setMinWidth(25);
    colQty.setId("colQty");
    colQty.setCellValueFactory(cellData -> cellData.getValue().quantityProperty().asObject());
    return colQty;
}

private TableColumn createPriceColumn() {
    TableColumn<Collection, Float> colPrice = new TableColumn("Price");
    colPrice.setMinWidth(25);
    colPrice.setId("colPrice");
    colPrice.setCellValueFactory(cellData -> cellData.getValue().priceProperty().asObject());
    return colPrice;
}

private TableColumn createAmountColumn() {
    TableColumn<Collection, Float> colAmount = new TableColumn("Amount");
    colAmount.setMinWidth(25);
    colAmount.setId("colAmount");
    colAmount.setCellValueFactory(cellData -> cellData.getValue().amountProperty().asObject());
    return colAmount;
}

private TableColumn createMNOColumn() {
    TableColumn colMNO = new TableColumn("M/NO");
    colMNO.setMinWidth(25);
    colMNO.setId("colMNO");
    colMNO.setCellValueFactory(new PropertyValueFactory("mno"));
    return colMNO;
}


private List<Collection> getCollection(){
    List<Collection> collections = new ArrayList<>();
    collections.add(new Collection(1, 10, "1", false));
    collections.add(new Collection(2, 10, "12", true));
    collections.add(new Collection(3, 10, "123", true));
    collections.add(new Collection(4, 10, "312", true));
    collections.add(new Collection(5, 10, "311", false));
    collections.add(new Collection(6, 10, "322", true));
    collections.add(new Collection(7, 10, "333", true));
    collections.add(new Collection(8, 10, "321", false));
    collections.add(new Collection(9, 10, "456", true));
    collections.add(new Collection(10, 10, "551", true));
    collections.add(new Collection(11, 10, "515", false));
    collections.add(new Collection(12, 10, "134", true));
    collections.add(new Collection(13, 10, "789", true));
    collections.add(new Collection(14, 10, "879", false));
    collections.add(new Collection(15, 10, "987", true));
    collections.add(new Collection(16, 10, "856", true));
    collections.add(new Collection(17, 10, "956", true));
    collections.add(new Collection(18, 10, "589", true));
    collections.add(new Collection(19, 10, "852", false));
    collections.add(new Collection(20, 10, "456", false));
    collections.add(new Collection(21, 10, "623", true));
    collections.add(new Collection(22, 10, "147", false));
    collections.add(new Collection(23, 10, "125", true));
    collections.add(new Collection(24, 10, "258", false));
    collections.add(new Collection(25, 10, "325", true));
    collections.add(new Collection(26, 10, "753", true));
    collections.add(new Collection(27, 10, "357", false));
    collections.add(new Collection(28, 10, "159", false));
    return collections;
}

public class Collection{
    private final FloatProperty quantity  = new SimpleFloatProperty();
    private final FloatProperty price  = new SimpleFloatProperty();
    private final FloatProperty amount  = new SimpleFloatProperty();
    private final BooleanProperty paid = new SimpleBooleanProperty(false);
    private String mno;

    public Collection(){
        this(0f, 0f, null, false);
    }

    public Collection(float quantity, float price, String mno, boolean paid) {
        setQuantity(quantity);
        setPrice(price);
        setMno(mno);
        setPaid(paid);
        this.amount.bind(this.quantity.multiply(this.price));
    }

    public String getMno() {
        return mno;
    }

    public void setMno(String mno) {
        this.mno = mno;
    }

    public float getQuantity() {
        return quantityProperty().get();
    }

    public void setQuantity(float quantity) {
        quantityProperty().set(quantity);
    }

    public FloatProperty quantityProperty() {
        return quantity ;
    }

    public float getPrice() {
        return priceProperty().get();
    }

    public void setPrice(float price) {
        priceProperty().set(price);
    }

    public FloatProperty priceProperty() {
        return price ;
    }

    public float getAmount() {
        return amountProperty().get();
    }

    public ReadOnlyFloatProperty amountProperty() {
        return amount ;
    }

    public BooleanProperty paidProperty() {
        return paid;
    }

    public void setPaid(boolean approved) {
        this.paid.set(approved);
    }

    public boolean isPaid() {
        return paid.get();
    }
}

}

0 个答案:

没有答案