当前位置: 首页 > 知识库问答 >
问题:

在VBox JavaFX-8中使用过滤器参数过滤TableView

薛修能
2023-03-14

下面的代码被修改为不包括我的数据库中的任何数据。

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;
}

然后将其传递到initialize方法中,在该方法中进行表的实际填充。

顺便说一下,Users类如下所示:

public class Users {
    private ImageView userImage;
    private VBox userDetails;

    public Users() {
        this.userImage = null;
        this.userDetails = null;
    }

    public Users(ImageView userImage, VBox userDetails) {
        this.userImage = userImage;
        this.userDetails = userDetails;
    }

    public ImageView getUserImage() {
        return userImage;
    }

    public void setUserImage(ImageView userImage) {
        this.userImage = userImage;
    }

    public VBox getUserDetails() {
        return userDetails;
    }

    public void setUserDetails(VBox userDetails) {
        this.userDetails = userDetails;
    }
}

该程序按预期工作,我可以看到与图像和VBox的详细信息的表格。

现在我想添加一个TextField来过滤表,过滤参数是标签中的文本。

我明白了,我需要将ObservableList放入FilteredList中,然后放入SortedList中。

共有1个答案

殷轶
2023-03-14

将数据存储在项中,而不是显示它们的节点!您可以使用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;
    }

}
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)));
 类似资料:
  • 在方法调用时,你可以通过方法参数过滤器,对传入方法的参数进行过滤处理。 注解说明 @FilterArg 属性名称 说明 name 参数名 filter 过滤器callable 用法示例 简单使用: /* * @FilterArg(name="data", filter="json_decode") */ public function test($data) { var_dump($d

  • 问题内容: 当我用ng-repeat迭代一些数组时,我想在过滤器中使用参数 例: HTML部分: JavaScript部分: 但是我希望能够使用像 但是它不起作用。我该怎么做? 问题答案: 更新: 我想我对文档的了解并不足够,但是您绝对可以使用具有以下语法的过滤器过滤器(请参阅此小提琴)来按对象的属性过滤: 如果有帮助,这是我的原始答案: 使用过滤器过滤器将无法传递参数,但是至少可以做两件事。 1

  • 问题内容: 我有一个,我想在一行中过滤掉负值(创建一个没有新数组)而不添加循环。使用Java 8 Lambda表达式是否可能? 在python中,将使用生成器: 是否可以在Java 8中做类似的简洁操作? 问题答案: 是的,您可以通过在数组中创建一个,滤除负片,然后将流转换回数组来实现此目的。这是一个例子: 如果要过滤不是的引用数组,则需要使用采用的方法来获取原始类型的数组作为结果:

  • 我有两个简单的POJOs: 然后我生成一些数据,我为父母添加100个孩子: 我的目标是移除所有10岁以下的儿童: 最后,我列出了十岁以上的孩子。但是我不想写一个单独的方法。 如何得到所有的父母与名单上的孩子十岁以上只使用单一流?

  • 问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在

  • 本文向大家介绍dynamics-crm 使用过滤器过滤API查询,包括了dynamics-crm 使用过滤器过滤API查询的使用技巧和注意事项,需要的朋友参考一下 示例 您可以使用filter属性从CRM检索值的子集。在此示例中,仅返回公司名称等于CompanyName的帐户。