必须使用javaFX搜索和删除按钮制作通讯簿

必须使用javaFX搜索和删除按钮制作通讯簿,java,javafx-2,Java,Javafx 2,我正在尝试使用添加,编辑,搜索和删除选项制作一个包含个人信息的通讯簿。见下文 搜索按钮:如果用户在块中添加一些信息,则 按Add如果其按Search则相应显示信息 删除按钮:如果用户选择某一行,即一个人的详细信息,则 按下删除按钮后,显示将从数据中删除的内容 我试图在添加按钮中添加ComboBox后从ComboBox获取值,但它没有将ComboBox值存储在tablecell中 我的问题是,当我从表中添加或删除一些PersonData时,它会删除,但在我按下搜索按钮后会继续更新,原因是什么 我现

我正在尝试使用
添加
编辑
搜索
删除
选项制作一个包含个人信息的通讯簿。见下文

  • 搜索按钮:如果用户在块中添加一些信息,则 按
    Add
    如果其按
    Search
    则相应显示信息
  • 删除按钮:如果用户选择某一行,即一个人的详细信息,则 按下删除按钮后,显示将从数据中删除的内容
  • 我试图在添加按钮中添加ComboBox后从ComboBox获取值,但它没有将ComboBox值存储在tablecell中
  • 我的问题是,当我从表中添加或删除一些PersonData时,它会删除,但在我按下搜索按钮后会继续更新,原因是什么

    我现在的代码到现在为止 请帮忙

    import java.util.Iterator;
    import javafx.application.Application;
    import javafx.beans.property.IntegerProperty;
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.Insets;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.Label;
    import javafx.scene.control.ListCell;
    import javafx.scene.control.ListView;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableColumn.CellEditEvent;
    import javafx.scene.control.TableView;
    import javafx.scene.control.TextField;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.control.cell.TextFieldTableCell;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.scene.paint.Color;
    import javafx.scene.text.Font;
    import javafx.stage.Stage;
    import javafx.util.Callback;
    
    public class MyAddressBook extends Application {
    
    // for delete selection
    private IntegerProperty index = new SimpleIntegerProperty();
    
    private TableView<Person> table = new TableView<Person>();
    // for Filter
    private ObservableList<Person> filteredList = FXCollections.observableArrayList();
    
    private final ObservableList<Person> data = FXCollections.observableArrayList
        (new Person("Jacob", "Smith", "Male","12 HouseNo 35Street Newyork", " 1234341", "12-01-1867","jacob.smith@example.com"),
         new Person("Isabella","Johnson", "Female", "6 HouseNo 10Street California"," 9876521", "12-01-1885", "isabella.johnson@example.com"),
         new Person("Ethan", "Williams", "Male","3 Villa House 3Street LosAngels", " 1122331","01-10-1871", "ethan.williams@example.com"));
    
    final HBox hb = new HBox();
    
    public static void main(String[] args) {
    launch(args);
    }
    
    public final double getIndex() {
        return index.get();
    }
    
    public final void setIndex(Integer value) {
        index.set(value);
    }
    
    public IntegerProperty indexProperty() {
        return index;
    }
    
    public void filterPerson(Person filteringPerson) {
        // first clear the data in the table.
        filteredList.clear();
        Iterator<Person> completeData = data.iterator();
        while (completeData.hasNext()) {
            Person person = (Person) completeData.next();
            // if the first name matches searching person name, then add it to
            if (person.getFirstName().contains(filteringPerson.getFirstName())) {
                this.filteredList.add(person);
            }
        }
    }
    
    @Override
    public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("Address Book");
        stage.setWidth(900);
        stage.setHeight(550);
    
        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));
    
        ComboBox genderComboBox = new ComboBox();
        genderComboBox.getItems().addAll("Male", "Female");
        genderComboBox.setValue("Male");
        genderComboBox
                .setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
                    @Override
                    public ListCell<String> call(ListView<String> param) {
                        final ListCell<String> cell = new ListCell<String>() {
                            {
                                super.setPrefWidth(100);
                            }
    
                            @Override
                            public void updateItem(String item, boolean empty) {
                                super.updateItem(item, empty);
                                if (item != null) {
                                    setText(item);
                                    if (item.contains("Male")) {
                                        setTextFill(Color.RED);
                                    } else if (item.contains("Female")) {
                                        setTextFill(Color.GREEN);
                                    } else {
                                        setTextFill(Color.BLACK);
                                    }
                                } else {
                                    setText(null);
                                }
                            }
                        };
                        return cell;
                    }
                });
    
        table.setEditable(true);
        TableColumn<Person, String> firstNameCol = new TableColumn<Person, String>(
                "First Name");
        firstNameCol.setMinWidth(100);
        firstNameCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
        // firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        firstNameCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setFirstName(t.getNewValue());
                    }
                });
    
        TableColumn lastNameCol = new TableColumn("Last Name");
        lastNameCol.setMinWidth(100);
        lastNameCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
        lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        lastNameCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setLastName(t.getNewValue());
                    }
                });
    
        TableColumn genderCol = new TableColumn("Gender");
        genderCol.setMinWidth(10);
        genderCol.setCellValueFactory(new PropertyValueFactory<Person, String>("gender"));
        genderCol.setCellFactory(TextFieldTableCell.forTableColumn());
        genderCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setGender(t.getNewValue());
                    }
                });
    
        TableColumn addressCol = new TableColumn("Address");
        addressCol.setMinWidth(200);
        addressCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>("address"));
        addressCol.setCellFactory(TextFieldTableCell.forTableColumn());
        addressCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setAddress(t.getNewValue());
                    }
                });
    
        TableColumn phoneNoCol = new TableColumn("Phone No");
        phoneNoCol.setMinWidth(100);
        phoneNoCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>("phoneNo"));
        phoneNoCol.setCellFactory(TextFieldTableCell.forTableColumn());
        phoneNoCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setPhoneNo(t.getNewValue());
                    }
                });
    
        TableColumn dateOfBirthCol = new TableColumn("Date Of Birth");
        dateOfBirthCol.setMinWidth(100);
        dateOfBirthCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>("dateOfBirth"));
        dateOfBirthCol.setCellFactory(TextFieldTableCell.forTableColumn());
        dateOfBirthCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setDateOfBirth(t.getNewValue());
                    }
                });
    
        TableColumn emailCol = new TableColumn("Email");
        emailCol.setMinWidth(150);
        emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));
        emailCol.setCellFactory(TextFieldTableCell.forTableColumn());
        emailCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
            @Override
            public void handle(CellEditEvent<Person, String> t) {
                ((Person) t.getTableView().getItems()
                        .get(t.getTablePosition().getRow())).setEmail(t
                        .getNewValue());
            }
        });
    
        table.setItems(filteredList);
        filteredList.addAll(data);
        table.getColumns().addAll(firstNameCol, lastNameCol, genderCol,
                addressCol, phoneNoCol, dateOfBirthCol, emailCol);
    
        final TextField addFirstName = new TextField();
        addFirstName.setPromptText("First Name");
        addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
        final TextField addLastName = new TextField();
        addLastName.setMaxWidth(lastNameCol.getPrefWidth());
        addLastName.setPromptText("Last Name");
    
        final TextField addGender = new TextField();
        addGender.setMaxWidth(genderCol.getPrefWidth());
        addGender.setPromptText("Gender");
    
        final TextField addAddress = new TextField();
        addAddress.setMaxWidth(addressCol.getPrefWidth());
        addAddress.setPromptText("Address");
        final TextField addPhoneNo = new TextField();
        addPhoneNo.setMaxWidth(phoneNoCol.getPrefWidth());
        addPhoneNo.setPromptText("PhoneNo");
        final TextField addDateOfBirth = new TextField();
        addDateOfBirth.setMaxWidth(dateOfBirthCol.getPrefWidth());
        addDateOfBirth.setPromptText("DateOfBirth");
        final TextField addEmail = new TextField();
        addEmail.setMaxWidth(emailCol.getPrefWidth());
        addEmail.setPromptText("Email");
    
        final Button addButton = new Button("Add");
        addButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                data.add(new Person(addFirstName.getText(), addLastName.getText(), addAddress.getText(), addPhoneNo.getText(),
                        addDateOfBirth.getText(), addEmail.getText(), addGender.getText()));
    
                addFirstName.clear();
                addLastName.clear();
                addAddress.clear();
                addPhoneNo.clear();
                addDateOfBirth.clear();
                addEmail.clear();
                addGender.clear();
            }
        });
    
        table.getSelectionModel().selectedItemProperty()
                .addListener(new ChangeListener() {
                    @Override
                    public void changed(ObservableValue observable,
                            Object oldvalue, Object newValue) {
                        Person selectedPerson = (Person) newValue;
                        setIndex(data.indexOf(newValue));
                        System.out.println("OK");
                    }
                });
    
        final Button delButton = new Button("Delete");
        delButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                data.remove(index.get());
                table.getSelectionModel().clearSelection();
            }
        });
    
        final Button searchButton = new Button("Search");
        searchButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                Person person = new Person(addFirstName.getText(), addLastName.getText(), addAddress.getText(), addPhoneNo.getText(),
                        addDateOfBirth.getText(), addEmail.getText(), addGender.getText());
                addFirstName.clear();
                addLastName.clear();
                addAddress.clear();
                addPhoneNo.clear();
                addDateOfBirth.clear();
                addEmail.clear();
                addGender.clear();
                filterPerson(person);
            }
        });
    
        hb.getChildren().addAll(addFirstName, addLastName, genderComboBox,addAddress, addPhoneNo, addDateOfBirth, addEmail, addButton,
                delButton, searchButton);
        hb.setSpacing(3);
    
        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(label, table, hb);
    
        ((Group) scene.getRoot()).getChildren().addAll(vbox);
    
        stage.setScene(scene);
        stage.show();
    }
    
    public static class Person implements Comparable<Person> {
    
        private final SimpleStringProperty firstName;
        private final SimpleStringProperty lastName;
        private final SimpleStringProperty gender;
        private final SimpleStringProperty address;
        private final SimpleStringProperty phoneNo;
        private final SimpleStringProperty dateOfBirth;
        private final SimpleStringProperty email;
    
        private Person(String fName, String lName, String gen, String address, String phNo, String dob, String email) {
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
            this.gender = new SimpleStringProperty(gen);
            this.address = new SimpleStringProperty(address);
            this.phoneNo = new SimpleStringProperty(phNo);
            this.dateOfBirth = new SimpleStringProperty(dob);
            this.email = new SimpleStringProperty(email);
        }
    
        public String getFirstName() {
            return firstName.get();
        }
    
        public void setFirstName(String fName) {
            firstName.set(fName);
        }
    
        public String getLastName() {
            return lastName.get();
        }
    
        public void setLastName(String fName) {
            lastName.set(fName);
        }
    
        public void setGender(String gen) {
            gender.set(gen);
        }
    
        public String getGender() {
            return gender.get();
        }
    
        public String getAddress() {
            return address.get();
        }
    
        public void setAddress(String add) {
            address.set(add);
        }
    
        public String getPhoneNo() {
            return phoneNo.get();
        }
    
        public void setPhoneNo(String phNo) {
            phoneNo.set(phNo);
        }
    
        public String getDateOfBirth() {
            return dateOfBirth.get();
        }
    
        public void setDateOfBirth(String dob) {
            dateOfBirth.set(dob);
        }
    
        public String getEmail() {
            return email.get();
        }
    
        public void setEmail(String fName) {
            email.set(fName);
        }
    
        @Override
        public int compareTo(Person o) {
            return firstName.get().compareToIgnoreCase(o.getFirstName());
        }
    }
    }
    
    import java.util.Iterator;
    导入javafx.application.application;
    导入javafx.beans.property.IntegerProperty;
    导入javafx.beans.property.SimpleIntegerProperty;
    导入javafx.beans.property.SimpleStringProperty;
    导入javafx.beans.value.ChangeListener;
    导入javafx.beans.value.observeValue;
    导入javafx.collections.FXCollections;
    导入javafx.collections.ObservableList;
    导入javafx.event.ActionEvent;
    导入javafx.event.EventHandler;
    导入javafx.geometry.Insets;
    导入javafx.scene.Group;
    导入javafx.scene.scene;
    导入javafx.scene.control.Button;
    导入javafx.scene.control.ComboBox;
    导入javafx.scene.control.Label;
    导入javafx.scene.control.ListCell;
    导入javafx.scene.control.ListView;
    导入javafx.scene.control.TableColumn;
    导入javafx.scene.control.TableColumn.CellEditEvent;
    导入javafx.scene.control.TableView;
    导入javafx.scene.control.TextField;
    导入javafx.scene.control.cell.PropertyValueFactory;
    导入javafx.scene.control.cell.TextFieldTableCell;
    导入javafx.scene.layout.HBox;
    导入javafx.scene.layout.VBox;
    导入javafx.scene.paint.Color;
    导入javafx.scene.text.Font;
    导入javafx.stage.stage;
    导入javafx.util.Callback;
    公共类MyAddressBook扩展了应用程序{
    //用于删除所选内容
    私有IntegerProperty索引=新的SimpleIntegerProperty();
    private TableView table=new TableView();
    //过滤器
    私有ObservableList filteredList=FXCollections.observableArrayList();
    私有最终ObservableList数据=FXCollections.observableArrayList
    (纽约35街12号、1234341号、12-01-1867号、雅各布。smith@example.com"),
    新人(“伊莎贝拉”、“约翰逊”、“女”、“加利福尼亚10街6号”、“9876521”、“12-01-1885”、“伊莎贝拉”。johnson@example.com"),
    新人(“伊桑”、“威廉姆斯”、“男性”、“3号别墅3号街天使”、“1122331”、“01-10-1871”、“伊桑”。williams@example.com"));
    最终HBox hb=新HBox();
    公共静态void main(字符串[]args){
    发射(args);
    }
    公共最终双getIndex(){
    返回索引get();
    }
    公共最终无效集合索引(整数值){
    索引集(值);
    }
    公共整数属性indexProperty(){
    收益指数;
    }
    公共无效过滤器人员(人员过滤器人员){
    //首先清除表中的数据。
    filteredList.clear();
    迭代器completeData=data.Iterator();
    while(completeData.hasNext()){
    Person=(Person)completeData.next();
    //如果名字与搜索人名匹配,则将其添加到
    if(person.getFirstName().contains(filteringPerson.getFirstName())){
    this.filteredList.add(person);
    }
    }
    }
    @凌驾
    公众假期开始(阶段){
    场景=新场景(新组());
    阶段。设置标题(“地址簿”);
    舞台布景宽度(900);
    舞台设置高度(550);
    最终标签=新标签(“地址簿”);
    label.setFont(新字体(“Arial”,20));
    ComboBox genderComboBox=新ComboBox();
    genderComboBox.getItems().addAll(“男性”、“女性”);
    genderComboBox.setValue(“男性”);
    性别调查箱
    .setCellFactory(新回调函数(){
    @凌驾
    公共ListCell调用(ListView参数){
    最终ListCell单元格=新ListCell(){
    {
    super.setPrefWidth(100);
    }
    @凌驾
    public void updateItem(字符串项,布尔值为空){
    super.updateItem(项,空);
    如果(项!=null){
    setText(项目);
    如果(项目包含(“男性”)){
    setTextFill(颜色为红色);
    }否则,如果(项目包含(“女性”)){
    setTextFill(颜色为绿色);
    }否则{
    setTextFill(颜色:黑色);
    }
    }否则{
    setText(空);
    }
    }
    };
    返回单元;
    }
    });
    table.setEditable(true);
    TableColumn firstNameCol=新的TableColumn(
    “名字”);
    firstNameCol.setMinWidth(100);
    第一名
    .setCellValueFactory(新属性ValueFactory(“名字”));
    //firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
    第一名
    .setOnEditCommit(新的EventHandler(){
    @凌驾
    公共无效句柄(CellEditEvent t){
    ((Person)t.getTableView().getItems()
    .get(t.getTablePosition().getRow())
    .setFirstName(t.getNewValue());
    }
    });
    TableColumn lastNameCol=新的TableColumn(“姓氏”);
    lastNameCol.setMinWidth(100);
    lastNameCol
    .setCellValueFactory(新属性ValueFactory(“lastNa
    
    final Button addButton = new Button("Add");
        addButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                data.add(new Person(
                        addFirstName.getText(),
                        addLastName.getText(),
                        addAddress.getText(),
                        addPhoneNo.getText(),
                        addDateOfBirth.getText(),
                        addEmail.getText(),
                        addGender.getText()));
                addFirstName.clear();
                addLastName.clear();
                addAddress.clear();
                addPhoneNo.clear();
                addDateOfBirth.clear();
                addEmail.clear();
                addGender.clear();
            }
        });
    
    hb.getChildren().addAll(addFirstName, addLastName, addGender, addAddress, addPhoneNo, addDateOfBirth, addEmail, addButton);
    
    final Button deleteButton = new Button("Delete");
        addButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                // Delete your date here
            }
        });
    
    hb.getChildren().addAll(addFirstName, addLastName, addGender, addAddress, addPhoneNo, addDateOfBirth, addEmail, addButton, deleteButton, searchButton);
    
    private ObservableList<Person>  filteredList= FXCollections.observableArrayList(); 
    
    tableView.setItems(filteredList);
    filteredList.addAll(data);
    
     final Button searchButton = new Button("search");
        searchButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                Person person = new Person(
                        addFirstName.getText(),
                        addLastName.getText(),
                        addAddress.getText(),
                        addPhoneNo.getText(),
                        addDateOfBirth.getText(),
                        addEmail.getText(),
                        addGender.getText());
                addFirstName.clear();
                addLastName.clear();
                addAddress.clear();
                addPhoneNo.clear();
                addDateOfBirth.clear();
                addEmail.clear();
                addGender.clear();
                filterPerson(person);
            }
        });
    
    protected void filterPerson( Person filteringPerson ){
        // first clear the data in the table.
        filteredList.clear();
        Iterator<Person> completeData = data.iterator();
        while( completeData.hasNext() ){
            Person person = (Person) completeData.next();
            // if the first name matches searching person name, then add  it to      
            if(person.getFirstName().contains( filteringPerson.getFirstName() )){
                this.filteredList.add( person );
            }
        }
    
        import java.util.Iterator;
        import javafx.application.Application;
        import javafx.beans.property.IntegerProperty;
        import javafx.beans.property.SimpleIntegerProperty;
        import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.value.ChangeListener;
    import javafx.beans.value.ObservableValue;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.Insets;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.Label;
    import javafx.scene.control.ListCell;
    import javafx.scene.control.ListView;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableColumn.CellEditEvent;
    import javafx.scene.control.TableView;
    import javafx.scene.control.TextField;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.control.cell.TextFieldTableCell;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.scene.paint.Color;
    import javafx.scene.text.Font;
    import javafx.stage.Stage;
    import javafx.util.Callback;
    
    public class MyAddressBook extends Application {
    
    // for delete selection
    private IntegerProperty index = new SimpleIntegerProperty();
    
    private TableView<Person> table = new TableView<Person>();
    // for Filter
    private ObservableList<Person> filteredList = FXCollections
            .observableArrayList();
    
    private final ObservableList<Person> data = FXCollections
            .observableArrayList(new Person("Jacob", "Smith", "Male",
                    "12 HouseNo 35Street Newyork", " 1234341", "12-01-1867",
                    "jacob.smith@example.com"), new Person("Isabella",
                    "Johnson", "Female", "6 HouseNo 10Street California",
                    " 9876521", "12-01-1885", "isabella.johnson@example.com"),
                    new Person("Ethan", "Williams", "Male",
                            "3 Villa House 3Street LosAngels", " 1122331",
                            "01-10-1871", "ethan.williams@example.com"));
    final HBox hb = new HBox();
    
    public static void main(String[] args) {
        launch(args);
    }
    
    public final double getIndex() {
        return index.get();
    }
    
    public final void setIndex(Integer value) {
        index.set(value);
    }
    
    public IntegerProperty indexProperty() {
        return index;
    }
    
    public void filterPerson(Person filteringPerson) {
        // first clear the data in the table.
        filteredList.clear();
        Iterator<Person> completeData = data.iterator();
        while (completeData.hasNext()) {
            Person person = (Person) completeData.next();
            // if the first name matches searching person name, then add it to
            if (person.getFirstName().contains(filteringPerson.getFirstName())) {
                this.filteredList.add(person);
            }
        }
    }
    
    @Override
    public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("Address Book");
        stage.setWidth(900);
        stage.setHeight(550);
    
        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));
    
        ComboBox genderComboBox = new ComboBox();
        genderComboBox.getItems().addAll("Male", "Female");
        genderComboBox.setValue("Male");
        genderComboBox
                .setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
                    @Override
                    public ListCell<String> call(ListView<String> param) {
                        final ListCell<String> cell = new ListCell<String>() {
                            {
                                super.setPrefWidth(100);
                            }
    
                            @Override
                            public void updateItem(String item, boolean empty) {
                                super.updateItem(item, empty);
                                if (item != null) {
                                    setText(item);
                                    if (item.contains("Male")) {
                                        setTextFill(Color.RED);
                                    } else if (item.contains("Female")) {
                                        setTextFill(Color.GREEN);
                                    } else {
                                        setTextFill(Color.BLACK);
                                    }
                                } else {
                                    setText(null);
                                }
                            }
                        };
                        return cell;
                    }
                });
    
        table.setEditable(true);
        TableColumn<Person, String> firstNameCol = new TableColumn<Person, String>(
                "First Name");
        firstNameCol.setMinWidth(100);
        firstNameCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>(
                        "firstName"));
        // firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        firstNameCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setFirstName(t.getNewValue());
                    }
                });
    
        TableColumn lastNameCol = new TableColumn("Last Name");
        lastNameCol.setMinWidth(100);
        lastNameCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>(
                        "lastName"));
        lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        lastNameCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setLastName(t.getNewValue());
                    }
                });
    
        TableColumn genderCol = new TableColumn("Gender");
        genderCol.setMinWidth(10);
        genderCol.setCellValueFactory(new PropertyValueFactory<Person, String>(
                "gender"));
        genderCol.setCellFactory(TextFieldTableCell.forTableColumn());
        genderCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setGender(t.getNewValue());
                    }
                });
    
        TableColumn addressCol = new TableColumn("Address");
        addressCol.setMinWidth(200);
        addressCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>(
                        "address"));
        addressCol.setCellFactory(TextFieldTableCell.forTableColumn());
        addressCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setAddress(t.getNewValue());
                    }
                });
    
        TableColumn phoneNoCol = new TableColumn("Phone No");
        phoneNoCol.setMinWidth(100);
        phoneNoCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>(
                        "phoneNo"));
        phoneNoCol.setCellFactory(TextFieldTableCell.forTableColumn());
        phoneNoCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setPhoneNo(t.getNewValue());
                    }
                });
    
        TableColumn dateOfBirthCol = new TableColumn("Date Of Birth");
        dateOfBirthCol.setMinWidth(100);
        dateOfBirthCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>(
                        "dateOfBirth"));
        dateOfBirthCol.setCellFactory(TextFieldTableCell.forTableColumn());
        dateOfBirthCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        ((Person) t.getTableView().getItems()
                                .get(t.getTablePosition().getRow()))
                                .setDateOfBirth(t.getNewValue());
                    }
                });
    
        TableColumn emailCol = new TableColumn("Email");
        emailCol.setMinWidth(150);
        emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>(
                "email"));
        emailCol.setCellFactory(TextFieldTableCell.forTableColumn());
        emailCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
            @Override
            public void handle(CellEditEvent<Person, String> t) {
                ((Person) t.getTableView().getItems()
                        .get(t.getTablePosition().getRow())).setEmail(t
                        .getNewValue());
            }
        });
    
        table.setItems(filteredList);
        filteredList.addAll(data);
        table.getColumns().addAll(firstNameCol, lastNameCol, genderCol,
                addressCol, phoneNoCol, dateOfBirthCol, emailCol);
    
        final TextField addFirstName = new TextField();
        addFirstName.setPromptText("First Name");
        addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
        final TextField addLastName = new TextField();
        addLastName.setMaxWidth(lastNameCol.getPrefWidth());
        addLastName.setPromptText("Last Name");
        final TextField addGender = new TextField();
        addGender.setMaxWidth(genderCol.getPrefWidth());
        addGender.setPromptText("Gender");
        final TextField addAddress = new TextField();
        addAddress.setMaxWidth(addressCol.getPrefWidth());
        addAddress.setPromptText("Address");
        final TextField addPhoneNo = new TextField();
        addPhoneNo.setMaxWidth(phoneNoCol.getPrefWidth());
        addPhoneNo.setPromptText("PhoneNo");
        final TextField addDateOfBirth = new TextField();
        addDateOfBirth.setMaxWidth(dateOfBirthCol.getPrefWidth());
        addDateOfBirth.setPromptText("DateOfBirth");
        final TextField addEmail = new TextField();
        addEmail.setMaxWidth(emailCol.getPrefWidth());
        addEmail.setPromptText("Email");
    
        final Button addButton = new Button("Add");
        addButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                data.add(new Person(addFirstName.getText(), addLastName
                        .getText(), addAddress.getText(), addPhoneNo.getText(),
                        addDateOfBirth.getText(), addEmail.getText(), addGender
                                .getText()));
                addFirstName.clear();
                addLastName.clear();
                addAddress.clear();
                addPhoneNo.clear();
                addDateOfBirth.clear();
                addEmail.clear();
                addGender.clear();
            }
        });
    
        table.getSelectionModel().selectedItemProperty()
                .addListener(new ChangeListener() {
                    @Override
                    public void changed(ObservableValue observable,
                            Object oldvalue, Object newValue) {
                        Person selectedPerson = (Person) newValue;
                        setIndex(data.indexOf(newValue));
                        System.out.println("OK");
                    }
                });
    
        final Button delButton = new Button("Delete");
        delButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                data.remove(index.get());
                table.getSelectionModel().clearSelection();
            }
        });
    
        final Button searchButton = new Button("Search");
        searchButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                Person person = new Person(addFirstName.getText(), addLastName
                        .getText(), addAddress.getText(), addPhoneNo.getText(),
                        addDateOfBirth.getText(), addEmail.getText(), addGender
                                .getText());
                addFirstName.clear();
                addLastName.clear();
                addAddress.clear();
                addPhoneNo.clear();
                addDateOfBirth.clear();
                addEmail.clear();
                addGender.clear();
                filterPerson(person);
            }
        });
    
        hb.getChildren().addAll(addFirstName, addLastName, genderComboBox,
                addAddress, addPhoneNo, addDateOfBirth, addEmail, addButton,
                delButton, searchButton);
        hb.setSpacing(3);
    
        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(label, table, hb);
    
        ((Group) scene.getRoot()).getChildren().addAll(vbox);
    
        stage.setScene(scene);
        stage.show();
    }
    
    public static class Person implements Comparable<Person> {
    
        private final SimpleStringProperty firstName;
        private final SimpleStringProperty lastName;
        private final SimpleStringProperty gender;
        private final SimpleStringProperty address;
        private final SimpleStringProperty phoneNo;
        private final SimpleStringProperty dateOfBirth;
        private final SimpleStringProperty email;
    
        private Person(String fName, String lName, String gen, String address,
                String phNo, String dob, String email) {
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
            this.gender = new SimpleStringProperty(gen);
            this.address = new SimpleStringProperty(address);
            this.phoneNo = new SimpleStringProperty(phNo);
            this.dateOfBirth = new SimpleStringProperty(dob);
            this.email = new SimpleStringProperty(email);
        }
    
        public String getFirstName() {
            return firstName.get();
        }
    
        public void setFirstName(String fName) {
            firstName.set(fName);
        }
    
        public String getLastName() {
            return lastName.get();
        }
    
        public void setLastName(String fName) {
            lastName.set(fName);
        }
    
        public void setGender(String gen) {
            gender.set(gen);
        }
    
        public String getGender() {
            return gender.get();
        }
    
        public String getAddress() {
            return address.get();
        }
    
        public void setAddress(String add) {
            address.set(add);
        }
    
        public String getPhoneNo() {
            return phoneNo.get();
        }
    
        public void setPhoneNo(String phNo) {
            phoneNo.set(phNo);
        }
    
        public String getDateOfBirth() {
            return dateOfBirth.get();
        }
    
        public void setDateOfBirth(String dob) {
            dateOfBirth.set(dob);
        }
    
        public String getEmail() {
            return email.get();
        }
    
        public void setEmail(String fName) {
            email.set(fName);
        }
    
        @Override
        public int compareTo(Person o) {
            return firstName.get().compareToIgnoreCase(o.getFirstName());
        }
    }