Making a search bar in javafx

后端 未结 1 1319
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-18 15:46

I have a code written using javafx that creates a tableview and then inserts the data given in another file. Im trying to implement a search bar. I want to be able to sear

相关标签:
1条回答
  • 2020-12-18 16:22

    Here is a sample app I altered from here.

    I altered the app to filter a TableView using a ChoiceBox, TextField, and a FilteredList. The TextField's onKeyReleased does the filtering based on the ChoiceBox's current value.

    Comments in the code.

    import javafx.application.Application;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.collections.transformation.FilteredList;
    import javafx.geometry.Insets;
    import javafx.geometry.Pos;
    import javafx.scene.Group;
    import javafx.scene.Scene;
    import javafx.scene.control.ChoiceBox;
    import javafx.scene.control.Label;
    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.HBox;
    import javafx.scene.layout.VBox;
    import javafx.scene.text.Font;
    import javafx.stage.Stage;
    
    public class TableViewSample extends Application
    {
    
        private TableView<Person> table = new TableView<Person>();
        private final ObservableList<Person> data
                = FXCollections.observableArrayList(
                        new Person("Jacob", "Smith", "jacob.smith@example.com"),
                        new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
                        new Person("Ethan", "Williams", "ethan.williams@example.com"),
                        new Person("Emma", "Jones", "emma.jones@example.com"),
                        new Person("Michael", "Brown", "michael.brown@example.com")
                );
    
        public static void main(String[] args)
        {
            launch(args);
        }
    
        @Override
        public void start(Stage stage)
        {
            Scene scene = new Scene(new Group());
            stage.setTitle("Table View Sample");
            stage.setWidth(450);
            stage.setHeight(550);
    
            final Label label = new Label("Address Book");
            label.setFont(new Font("Arial", 20));
    
            table.setEditable(true);
    
            TableColumn firstNameCol = new TableColumn("First Name");
            firstNameCol.setMinWidth(100);
            firstNameCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("firstName"));
    
            TableColumn lastNameCol = new TableColumn("Last Name");
            lastNameCol.setMinWidth(100);
            lastNameCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("lastName"));
    
            TableColumn emailCol = new TableColumn("Email");
            emailCol.setMinWidth(200);
            emailCol.setCellValueFactory(
                    new PropertyValueFactory<Person, String>("email"));
    
            FilteredList<Person> flPerson = new FilteredList(data, p -> true);//Pass the data to a filtered list
            table.setItems(flPerson);//Set the table's items using the filtered list
            table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
    
            //Adding ChoiceBox and TextField here!
            ChoiceBox<String> choiceBox = new ChoiceBox();
            choiceBox.getItems().addAll("First Name", "Last Name", "Email");
            choiceBox.setValue("First Name");
    
            TextField textField = new TextField();
            textField.setPromptText("Search here!");
            textField.setOnKeyReleased(keyEvent ->
            {
                switch (choiceBox.getValue())//Switch on choiceBox value
                {
                    case "First Name":
                        flPerson.setPredicate(p -> p.getFirstName().toLowerCase().contains(textField.getText().toLowerCase().trim()));//filter table by first name
                        break;
                    case "Last Name":
                        flPerson.setPredicate(p -> p.getLastName().toLowerCase().contains(textField.getText().toLowerCase().trim()));//filter table by first name
                        break;
                    case "Email":
                        flPerson.setPredicate(p -> p.getEmail().toLowerCase().contains(textField.getText().toLowerCase().trim()));//filter table by first name
                        break;
                }
            });
    
            choiceBox.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) ->
            {//reset table and textfield when new choice is selected
                if (newVal != null)
                {
                    textField.setText("");
                    flPerson.setPredicate(null);//This is same as saying flPerson.setPredicate(p->true);
                }
            });
            HBox hBox = new HBox(choiceBox, textField);//Add choiceBox and textField to hBox
            hBox.setAlignment(Pos.CENTER);//Center HBox
            final VBox vbox = new VBox();
            vbox.setSpacing(5);
            vbox.setPadding(new Insets(10, 0, 0, 10));
            vbox.getChildren().addAll(label, table, hBox);
    
            ((Group) scene.getRoot()).getChildren().addAll(vbox);
    
            stage.setScene(scene);
            stage.show();
        }
    
        public static class Person
        {
    
            private final SimpleStringProperty firstName;
            private final SimpleStringProperty lastName;
            private final SimpleStringProperty email;
    
            private Person(String fName, String lName, String email)
            {
                this.firstName = new SimpleStringProperty(fName);
                this.lastName = new SimpleStringProperty(lName);
                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 String getEmail()
            {
                return email.get();
            }
    
            public void setEmail(String fName)
            {
                email.set(fName);
            }
        }
    }
    

    0 讨论(0)
提交回复
热议问题