用于组合框的JavaFX ListProperty过滤器

时间:2015-03-26 14:07:11

标签: combobox javafx-8 listproperty

我有一个ListProperty,我在其中从数据库加载应用程序操作员列表。我想只显示在ComboBox中具有活动状态的运算符。

我试图在修改ListProperty时过滤它,但是当我只更新操作员状态时它不起作用。我还试图找到一种方法将运算符列表绑定到filteredList。

我的两个模特:

  

Operator.java

/**
 * Model representing an operator in the application.
 *
 * @author Mathieu DARÉ
 */

package com.dare.tkpf.esatraceability.model;


import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;





public class Operator {

//
// Attributes of the operator...
//
    private IntegerProperty                IDProperty;
    private StringProperty                 firstNameProperty;
    private StringProperty                 lastNameProperty;
    private ObjectProperty<OperatorStatus> statusProperty;
    private ObjectProperty<LocalDateTime>  dateTimeAddedProperty;
    private StringProperty                 dateTimeAddedStringProperty;





    /**
     * Constructor of the Operator.
     *
     * @param ID            The operator's ID.
     * @param firstName     The operator's first name.
     * @param lastName      The operator's last name.
     * @param status        The operator's status.
     * @param datetimeAdded The date/time of when the operator has been added.
     */
    public Operator(int ID, String firstName, String lastName, OperatorStatus status, LocalDateTime dateTimeAdded) {

        this.IDProperty                  = new SimpleIntegerProperty(ID);
        this.firstNameProperty           = new SimpleStringProperty(firstName);
        this.lastNameProperty            = new SimpleStringProperty(lastName);
        this.statusProperty              = new SimpleObjectProperty<OperatorStatus>(status);
        this.dateTimeAddedProperty       = new SimpleObjectProperty<LocalDateTime>(dateTimeAdded);
        this.dateTimeAddedStringProperty = new SimpleStringProperty( dateTimeAddedProperty.get().format( DateTimeFormatter.ofPattern("'le' dd/MM/yyyy 'à' HH:mm:ss") ) );

    }



//
// Setter, getters for the operator's ID...
//

    /**
     * Setter for the operator's ID.
     *
     * @param ID The ID of the operator.
     */
    public void setID(int ID) {

        this.IDProperty.set(ID);

    }



    /**
     * Getter for the operator's ID.
     *
     * @return The ID of the operator.
     */
    public int getID() {

        return this.IDProperty.get();

    }



    /**
     * Getter for the operator's ID property.
     *
     * @return The ID property of the operator.
     */
    public IntegerProperty IDProperty() {

        return this.IDProperty;

    }



//
// Setter, getters for the operator's first name...
//

    /**
     * Setter for the operator's first name.
     *
     * @param firstName The first name of the operator.
     */
    public void setFirstName(String firstName) {

        this.firstNameProperty.set(firstName);

    }



    /**
     * Getter for the operator's first name.
     *
     * @return The first name of the operator.
     */
    public String getFirstName() {

        return this.firstNameProperty.get();

    }



    /**
     * Getter for the operator's first name property.
     *
     * @return The first name property of the operator.
     */
    public StringProperty firstNameProperty() {

        return this.firstNameProperty;

    }



//
// Setter, getters for the operator's last name...
//

    /**
     * Setter for the operator's last name.
     *
     * @param lastName The last name of the operator.
     */
    public void setLastName(String lastName) {

        this.lastNameProperty.set(lastName);

    }



    /**
     * Getter for the operator's last name.
     *
     * @return The last name of the operator.
     */
    public String getLastName() {

        return this.lastNameProperty.get();

    }



    /**
     * Getter for the operator's last name property.
     *
     * @return The last name property of the operator.
     */
    public StringProperty lastNameProperty() {

        return this.lastNameProperty;

    }



//
// Setter, getters for the operator's status...
//

    /**
     * Setter for the operator's status.
     *
     * @param status The status of the operator.
     */
    public void setStatus(OperatorStatus status) {

        this.statusProperty.get().setID( status.getID() );
        this.statusProperty.get().setDescription( status.getDescription() );

    }



    /**
     * Getter for the operator's status.
     *
     * @return The status of the operator.
     */
    public OperatorStatus getStatus() {

        return this.statusProperty.get();

    }



    /**
     * Getter for the operator's status property.
     *
     * @return The status property of the part.
     */
    public ObjectProperty<OperatorStatus> statusProperty() {

        return this.statusProperty;

    }



    /**
     * Getter for the operator's status description.
     *
     * @return The status description of the operator.
     */
    public String getStatusDescription() {

        return this.statusProperty.get().descriptionProperty().get();

    }



    /**
     * Getter for the operator's status description property.
     *
     * @return The status description property of the part.
     */
    public StringProperty statusDescriptionProperty() {

        return this.statusProperty.get().descriptionProperty();

    }



//
// Setter, getters for the date/time the operator has been added...
//

    /**
     * Setter for the date/time the operator has been added.
     *
     * @param datetimeAdded The date/time the operator has been added.
     */
    public void setDateTimeAdded(LocalDateTime datetimeAdded) {

        this.dateTimeAddedProperty.set(datetimeAdded);

        this.dateTimeAddedStringProperty = new SimpleStringProperty( dateTimeAddedProperty.get().format( DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss") ) );

    }



    /**
     * Getter for the date/time the operator has been added.
     *
     * @return The date/time the operator has been added.
     */
    public LocalDateTime getDateTimeAdded() {

        return this.dateTimeAddedProperty.get();

    }



    /**
     * Getter for the date/time property of when the operator has been added.
     *
     * @return The date/time property of when the operator has been added.
     */
    public ObjectProperty<LocalDateTime> dateTimeAddedProperty() {

        return this.dateTimeAddedProperty;

    }



    /**
     * Getter for the date/time string property of when the operator has been added.
     *
     * @return The date/time string property of when the operator has been added.
     */
    public StringProperty dateTimeAddedStringProperty() {

        return this.dateTimeAddedStringProperty;

    }



//
// Utility methods...
//

    /**
     * Method converting the model into a string describing the operator (For direct use in the UI).
     *
     * @return The string describing the operator.
     */
    @Override
    public String toString() {

        return getFirstName() + " " + getLastName();

    }

}
  

OperatorStatus.java

/**
 * Model representing an operator status in the application.
 *
 * @author Mathieu DARÉ
 */

package com.dare.tkpf.esatraceability.model;


import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;





public class OperatorStatus {

//
// Attributes of the operator status...
//
    private IntegerProperty IDProperty;
    private StringProperty  descriptionProperty;





    /**
     * Constructor of the operator status.
     *
     * @param ID          The operator status' ID.
     * @param description The operator status' description.
     */
    public OperatorStatus(int ID, String description) {

        this.IDProperty          = new SimpleIntegerProperty(ID);
        this.descriptionProperty = new SimpleStringProperty(description);

    }



//
// Setter, getters for the operator status' ID...
//

    /**
     * Setter for the operator status' ID.
     *
     * @param ID The ID of the operator status.
     */
    public void setID(int ID) {

        this.IDProperty.set(ID);

    }



    /**
     * Getter for the operator status' ID.
     *
     * @return The ID of the operator status.
     */
    public int getID() {

        return this.IDProperty.get();

    }



    /**
     * Getter for the operator status' ID property.
     *
     * @return The ID property of the operator status.
     */
    public IntegerProperty IDProperty() {

        return this.IDProperty;

    }



//
// Setter, getters for the operator status' description...
//

    /**
     * Setter for the operator status' description.
     *
     * @param description The description of the operator status.
     */
    public void setDescription(String description) {

        this.descriptionProperty.set(description);

    }



    /**
     * Getter for the operator status' description.
     *
     * @return The description of the operator status.
     */
    public String getDescription() {

        return this.descriptionProperty.get();

    }



    /**
     * Getter for the operator status' description property.
     *
     * @return The description property of the operator status.
     */
    public StringProperty descriptionProperty() {

        return this.descriptionProperty;

    }



//
// Utility methods...
//

    /**
     * Method converting the operator status to string.
     *
     * @return The description of the status.
     */
    @Override
    public String toString() {

        return getDescription();

    }

}

我的应用程序的数据持有者,我想在其中创建运算符列表的过滤版本,以便在组合框中使用:

  

ESATraceabilityDataHolder.java

/**
 * Data holder of the application. Contains all the properties and observable data shared through the entire application.
 *
 * @author Mathieu DARÉ
 */

package com.dare.tkpf.esatraceability;


import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleListProperty;

import com.dare.tkpf.esatraceability.model.NomenclatureStatus;
import com.dare.tkpf.esatraceability.model.Operator;
import com.dare.tkpf.esatraceability.model.OperatorStatus;
import com.dare.tkpf.esatraceability.model.Part;





public class ESATraceabilityDataHolder {

//
// Instance of the data holder...
//
    private static ESATraceabilityDataHolder instance = null;


//
// Reference toward the app DBMS...
//
    private static ESATraceabilityDBMS dbms = ESATraceabilityDBMS.getInstance();


//
// Properties and observable values of the application...
//
    private static ListProperty<OperatorStatus>     operatorStatuses     = null;
    private static ListProperty<Operator>           operators            = null;
    private static ListProperty<Part>               halfFinished         = null;
    private static ListProperty<NomenclatureStatus> nomenclatureStatuses = null;





//
// Constructor and base methods of the data holder...
//

    /**
     * Constructor of the data holder.
     */
    private ESATraceabilityDataHolder() {

        // Retrieval of the base data from the database at launch...
        operatorStatuses     = new SimpleListProperty<>( dbms.getOperatorsStatuses() );
        operators            = new SimpleListProperty<>( dbms.getOperators() );
        halfFinished         = new SimpleListProperty<>( dbms.getHalfFinished() );
        nomenclatureStatuses = new SimpleListProperty<>( dbms.getNomenclatureStatuses() );

    }



    /**
     * Getter of the data holder instance.
     *
     * @return Instance of the data holder.
     */
    public static ESATraceabilityDataHolder getInstance() {

        // If the data holder doesn't exist yet, we instantiate it...
        if( instance == null ) { instance = new ESATraceabilityDataHolder(); }

        return instance;

    }



//
// Getters for the shared data of the application...
//

    /**
     * Getter for the operator statuses list.
     *
     * @return The list of the operator statuses.
     */
    public ListProperty<OperatorStatus> getOperatorStatuses() {

        return operatorStatuses;

    }



    /**
     * Getter for the operators list.
     *
     * @return The list of all the operators.
     */
    public ListProperty<Operator> getOperators() {

        return operators;

    }



    /**
     * Getter for the half-finished list.
     *
     * @return The list of all the half-finished.
     */
    public ListProperty<Part> getHalfFinished() {

        return halfFinished;

    }



    /**
     * Getter for the nomenclature statuses' list.
     *
     * @return The list of the operator statuses.
     */
    public ListProperty<NomenclatureStatus> getNomenclatureStatuses() {

        return nomenclatureStatuses;

    }

}

提前致谢。

1 个答案:

答案 0 :(得分:1)

首先创建ObservableList<Operator>,如果operatorStatus或其id发生更改,则会触发更新通知。这可以通过创建可观察列表并指定extractor

来实现
ESATraceabilityDataHolder data = ESATraceabilityDataHolder.getInstance();

ObservableList<Operator> operators = FXCollections.observableList(data.getOperators().get(),
    operator -> new Observable[] {Bindings.select(operator.statusProperty(), "ID")});

现在创建一个FilteredList,用于过滤状态id

final int statusActiveId = ... ;

FilteredList<Operator> activeOperators = new FilteredList<>(operators, operator -> 
    operator.getStatus().getId() == statusActiveId );

然后

ComboBox<Operator> combo = new ComboBox<>(activeOperators);