在VBox JavaFX-8中使用筛选器参数筛选TableView
好的,我放弃了一个GridPane支持的表实现,而选择了一个合适的TableView 在表中,左列是一个ImageView,右列是一个带有标签的VBox 下面的代码被修改为在我的数据库中不包含任何数据在VBox JavaFX-8中使用筛选器参数筛选TableView,java,tableview,javafx-8,filtering,Java,Tableview,Javafx 8,Filtering,好的,我放弃了一个GridPane支持的表实现,而选择了一个合适的TableView 在表中,左列是一个ImageView,右列是一个带有标签的VBox 下面的代码被修改为在我的数据库中不包含任何数据 public ObservableList<Users> showUserData() { for(int i = 0; i <= 5; i++) { Image image = new Image("file:///" + [path to whatev
public ObservableList<Users> showUserData() {
for(int i = 0; i <= 5; i++) {
Image image = new Image("file:///" + [path to whatever image in your PC]);
VBox vbox = new VBox();
vbox.getChildren().addAll(new Label("Name: " + "a name"),
new Label("Username: " + "a username"),
new Label("Position: " + "a position"));
ImageView pic = new ImageView();
pic.setFitHeight(150);
pic.setFitWidth(150);
pic.setImage(image);
pic.setSmooth(true);
pic.setPreserveRatio(true);
users.add(new Users(pic, vbox));
}
return users;
}
程序按预期工作,我可以看到带有图像的表格和包含详细信息的VBox
现在,我想添加一个过滤表的TextField,过滤参数是标签中的文本
我明白了,我需要把一个可观察列表放入一个过滤列表,然后放入一个分类列表
但是,由于过滤器参数放在VBox中,而不是单独的列中,所以我在互联网上看到的任何示例都不适用,除非我那么笨。此外,参数位于标签内,而不仅仅是普通字符串
我一直遵循本教程进行筛选:
我认为这是一个非常特殊的情况,但设计要求我坚持下去。我需要帮助,提示,或者任何指导。谢谢。将数据存储在项目中,而不是显示它们的节点中!您可以使用CellFactory创建以您喜欢的方式显示数据的单元格:
public class UserDetails {
private final String name;
private final String username;
private final String position;
public UserDetails(String name, String username, String position) {
this.name = name;
this.username = username;
this.position = position;
}
public String getName() {
return name;
}
public String getUsername() {
return username;
}
public String getPosition() {
return position;
}
}
这需要一点努力,但我做到了,谢谢!顺便说一下,插入一行后,您不知道有什么方法可以刷新表,是吗?您的意思是像使用可观察属性/?或者,从JavaFX8U60开始,TableView中有一个刷新方法,可以更新所有单元格。。。
public class UserDetails {
private final String name;
private final String username;
private final String position;
public UserDetails(String name, String username, String position) {
this.name = name;
this.username = username;
this.position = position;
}
public String getName() {
return name;
}
public String getUsername() {
return username;
}
public String getPosition() {
return position;
}
}
public class User {
private UserDetails userDetails;
private Image image;
public User(UserDetails userDetails, Image image) {
this.userDetails = userDetails;
this.image = image;
}
public UserDetails getUserDetails() {
return userDetails;
}
public Image getImage() {
return image;
}
}
public ObservableList<User> showUserData() {
ObservableList<User> users = FXCollections.observableArrayList();
for (int i = 0; i <= 5; i++) {
users.add(new User(
new UserDetails("a name", "a username", "a position"),
new Image("https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png")));
}
return users;
}
@Override
public void start(Stage primaryStage) {
TableView<User> table = new TableView<>(showUserData());
TableColumn<User, Image> imageColumn = new TableColumn<>();
TableColumn<User, UserDetails> userDetailsColumn = new TableColumn<>();
table.getColumns().addAll(imageColumn, userDetailsColumn);
imageColumn.setCellValueFactory(new PropertyValueFactory<>("image"));
userDetailsColumn.setCellValueFactory(new PropertyValueFactory<>("userDetails"));
imageColumn.setCellFactory(col -> new TableCell<User, Image>() {
private final ImageView imageView = new ImageView();
{
imageView.setFitHeight(150);
imageView.setFitWidth(150);
imageView.setSmooth(true);
imageView.setPreserveRatio(true);
}
@Override
protected void updateItem(Image item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
imageView.setImage(null);
setGraphic(null);
} else {
imageView.setImage(item);
setGraphic(imageView);
}
}
});
userDetailsColumn.setCellFactory(col -> new TableCell<User, UserDetails>() {
private final Label nameLabel = new Label();
private final Label userNameLabel = new Label();
private final Label positionLabel = new Label();
private final VBox vbox = new VBox(nameLabel, userNameLabel, positionLabel);
@Override
protected void updateItem(UserDetails item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setGraphic(null);
} else {
nameLabel.setText("Name: "+item.getName());
userNameLabel.setText("Username: "+item.getUsername());
positionLabel.setText("Position: "+item.getPosition());
setGraphic(vbox);
}
}
});
Scene scene = new Scene(table);
primaryStage.setScene(scene);
primaryStage.show();
}
TextField textField = ...
FilteredList<User> filteredList = ...
textField.textProperty().addListener((observable, oldValue, newValue) -> filteredList.setPredicate(newValue.isEmpty()
? null
: user -> user.getName().contains(newValue)
|| user.getUsername().contains(newValue)
|| user.getPosition().contains(newValue)));