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

javafx tableview中的快速过滤

终翔
2023-03-14

我需要在javafx tableview中实现一个拥有庞大数据(大约10万)的过滤器,

我试过这个教程。它可以工作,但与swing排序和过滤相比,过滤速度非常慢。

谁能帮我提速吗。

现在正在发生的事情是,当我键入textproperty change fire up和filterdata时,但速度很慢,我需要一些东西来显示筛选结果,并在swing中快速键入。

提前谢谢。

p、 我也看过这个。

共有3个答案

颛孙博易
2023-03-14

我使用这段代码进行过滤,但实际上我没有在大数据情况下进行测试

textField.textProperty().addListener(new InvalidationListener() {

        @Override
        public void invalidated(Observable observable) {
            if(textField.textProperty().get().isEmpty()) {
                tableView.setItems(dataList);
                return;
            }
            ObservableList<ClassModel> tableItems = FXCollections.observableArrayList();
            ObservableList<TableColumn<ClassModel, ?>> cols = tableView.getColumns();
            for(int i=0; i<dataList.size(); i++) {

                for(int j=0; j<cols.size(); j++) {
                    TableColumn col = cols.get(j);
                    String cellValue = col.getCellData(dataList.get(i)).toString();
                    cellValue = cellValue.toLowerCase();
                    if(cellValue.contains(textField.textProperty().get().toLowerCase())) {
                        tableItems.add(data.get(i));
                        break;
                    }                        
                }
            }
            tableView.setItems(tableItems);

        }
    });

ClassModel是您的模型类

孟财
2023-03-14

您可以使用以下代码。它对我来说很好...

ObservableList data =  table.getItems();
textfield.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
            if (oldValue != null && (newValue.length() < oldValue.length())) {
                table.setItems(data);
            }
            String value = newValue.toLowerCase();
            ObservableList<T> subentries = FXCollections.observableArrayList();

            long count = table.getColumns().stream().count();
            for (int i = 0; i < table.getItems().size(); i++) {
                for (int j = 0; j < count; j++) {
                    String entry = "" + table.getColumns().get(j).getCellData(i);
                    if (entry.toLowerCase().contains(value)) {
                        subentries.add(table.getItems().get(i));
                        break;
                    }
                }
            }
            table.setItems(subentries);
        });
谭梓
2023-03-14

您可以使用FilteredList

ObservableList<YourObjectClass> actualList = ...;
FilteredList<YourObjectClass> filteredList = new FilteredList<>(actualList);

TableView table = ...;
table.setItems(filteredList);

// to filter
filteredList.setPredicate(
    new Predicate<YourObjectClass>(){
        public boolean test(YourObjectClass t){
            return false; // or true
        }
    }
);

和秋千一样快(也许比秋千更快…)。(我测试了100000行)

 类似资料:
  • 在Tableau中,使用度量和维度上的右键单击选项可以快速获得许多过滤器类型。这些过滤器具有足够的功能来解决大多数日常过滤需求。这些过滤器称为快速过滤器。 以下屏幕截图显示了如何访问快速过滤器: 下表给出了在Tableau中各种快速过滤器及其用法。 过滤器 作用/目的 单值(列表) 它在列表中一次只选择一个值。 单值(下拉) 它在下拉列表中选择单个值。 多值(列表) 它在列表中一次可选择一个或多个

  • 问题内容: 我真的是Swift的新手,我刚刚读到类是通过引用传递的,并且复制了数组/字符串等。 通过引用进行传递是否与在Objective-C或Java中通过“ a”引用进行传递的方式相同,还是通过引用进行正确传递? 问题答案: Swift中的事物类型 规则是: 类实例是 引用类型 (即, 您 对类实例的引用实际上是一个 指针 ) 函数是参考类型 其他一切都是 价值类型 ; “其他所有内容”仅表示

  • 问题内容: 是否有用于eclipse的插件,可让我从界面快速生成新类? 无需在新的类对话框中进行键入 理想情况下,让我选择一个像Impl这样的标准名称来生成它 问题答案: 我还没有看到执行此操作的任何插件,但是对我来说,这似乎是一个合理的捷径。 以下内容可以构成插件直接从所选接口生成类的基础。它可以在我的box(TM)上使用。 当前假定类将使用带有“ Impl”后缀的接口名称,并且如果该类型已经存

  • 我创建了一个TableView,其中包含一个复选框列(isSelected)和三个信息列(姓名、姓氏、职务)。我想根据用户信息禁用一些复选框。例如,如果用户名为“Peter”,则Peter旁边的复选框将被禁用。但我不能。以下是我的一些代码: 人JAVA 控制器。JAVA

  • 问题内容: 我正在寻找Java 的快速实现。我看到实现了该接口,但是它只会和正确的一样快吗?有没有办法有一个队列会更快尤其是对(我只需要,并检查)。我可能还需要一个,但现在还不需要。 问题答案: 我看到LinkedList实现了Queue接口,但是它只会和LinkedList一样快吗? 盯着源代码,对于Queue.add,Queue.poll和Queue.peek操作,LinkedList为O(1

  • 问题内容: 我正在尝试获取数百个远程图像的图像大小(图像尺寸,宽度和高度),而且速度太慢。 我做了一些阅读,发现最快的方法是从图像中读取一定数量的字节并检查二进制数据的大小。 有人尝试过吗?我将如何检查不同的格式?有人看到过任何图书馆吗? 问题答案: 测试… 640 x 480(0.20859s) 加载32kb数据对我有用。