我有一个使用javafx编写的代码,它创建了一个tableview,然后在另一个文件中插入给定的数据。我正在尝试实现一个搜索栏。我希望能够在gui中搜索表并显示匹配项。有什么方向吗?编辑:我知道这个问题涉及面很广,我并不期望得到准确的答案,我只是在寻找方向。
okxuctiv1#
这是一个示例应用程序,我从这里修改。我修改了应用程序来过滤 TableView 使用 ChoiceBox , TextField ,和 FilteredList . 这个TextField's onKeyReleased 过滤是否基于 ChoiceBox's 当前值。代码中的注解。
TableView
ChoiceBox
TextField
FilteredList
onKeyReleased
ChoiceBox's
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.textProperty().addListener((obs, oldValue, newValue) -> { switch (choiceBox.getValue())//Switch on choiceBox value { case "First Name": flPerson.setPredicate(p -> p.getFirstName().toLowerCase().contains(newValue.toLowerCase().trim()));//filter table by first name break; case "Last Name": flPerson.setPredicate(p -> p.getLastName().toLowerCase().contains(newValue.toLowerCase().trim()));//filter table by last name break; case "Email": flPerson.setPredicate(p -> p.getEmail().toLowerCase().contains(newValue.toLowerCase().trim()));//filter table by email break; } }); choiceBox.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> {//reset table and textfield when new choice is selected if (newVal != null) { textField.setText(""); } }); 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); } } }
于2021年8月1日更新。它现在使用 TextProperty 而不是 KeyListener 设置筛选结果的 predicate 。
TextProperty
KeyListener
1条答案
按热度按时间okxuctiv1#
这是一个示例应用程序,我从这里修改。
我修改了应用程序来过滤
TableView
使用ChoiceBox
,TextField
,和FilteredList
. 这个TextField's
onKeyReleased
过滤是否基于ChoiceBox's
当前值。代码中的注解。
于2021年8月1日更新。它现在使用
TextProperty
而不是KeyListener
设置筛选结果的 predicate 。