Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX TableView性能问题_Java_Performance_Javafx_Javafx 2_Tableview - Fatal编程技术网

JavaFX TableView性能问题

JavaFX TableView性能问题,java,performance,javafx,javafx-2,tableview,Java,Performance,Javafx,Javafx 2,Tableview,我正在使用javafx表视图控件来显示我的表数据。现在数据非常庞大,当我显示控件中的完整数据时,它崩溃了。是否有任何方法可以做到这一点,或者我必须缓存数据,以便以块的形式显示数据。我应该改用JTable吗?我不太确定我是否正确理解您的问题,但延迟加载项目又如何呢?其实有一个。虽然它是针对TreeView而不是TableView的,但您应该能够简单地适应其背后的想法 希望这有帮助,至少对我的TreeView来说,它解决了很多问题 干杯, Regine我使用CellFactory类在tablevie

我正在使用javafx表视图控件来显示我的表数据。现在数据非常庞大,当我显示控件中的完整数据时,它崩溃了。是否有任何方法可以做到这一点,或者我必须缓存数据,以便以块的形式显示数据。我应该改用JTable吗?

我不太确定我是否正确理解您的问题,但延迟加载项目又如何呢?其实有一个。虽然它是针对TreeView而不是TableView的,但您应该能够简单地适应其背后的想法

希望这有帮助,至少对我的TreeView来说,它解决了很多问题

干杯,
Regine

我使用CellFactory类在tableview上进行了延迟加载。。。我会尽力解释,任何英语比我好的人都可以自由编辑,让它更容易理解

首先,我在Bean中使用一个强制属性来检查该Bean是否已经加载。这样我就不需要专门为此创建属性

其次,我在加载了'id'属性的情况下将Bean集合加载到TableView中,这使得我的表显示为空

最后,我创建了一个CellFactory,如下所示,以检查对象是否已加载,如果未加载,请立即执行

namecolumn.setCellFactory(new Callback<TableColumn<PersonBean, String>, TableCell<PersonBean, String>>() {
@Override
  public TableCell<PersonBean, String> call(TableColumn<PersonBean, String> param) {
    TableCell<PersonBean, String> newtablecell = new TableCell<PersonBean, String>() {
      @Override
      protected void updateItem(String item, boolean empty) {
        // Since I got some strange errors when method getIndex() return greatter value than my collection size, I need to validate before getting the object
        if (getIndex() < getItems().size()) {
          //Retrieve the collection object
          PersonBean personbean = getItems().get(getIndex());
          // Name is mandatory, so if it is null my bean was not loaded yet
          if (personbean.getName() == null) {
            // Call other centralized method to make load, details explained later
            loadPersonBean(personbean);
          }
          // Now I put the value on TableCell. Remember "item" still empty so we need to use Bean
          setText(personbean.getName());
          setAlignment(Pos.CENTER);
        }
      }
    };
    return newtablecell;
  }
});
namecolumn.setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableColumn参数){
TableCell newtablecell=新的TableCell(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
//由于方法getIndex()返回的值大于集合大小时出现了一些奇怪的错误,因此需要在获取对象之前进行验证
if(getIndex()
在loadPersonBean方法中,我传递TableView集合中包含的对象,并从数据库中加载它。然后将所有需要的数据复制到从表中接收的bean中。我没有尝试在TableView中交换对象,但我相信这可能会导致并发异常

其他观察:在我的所有测试中,TableView始终遵守调用我的CellFactory的列顺序,但我没有测试如果用户交换列顺序,它是否仍然遵守该顺序。所以我更喜欢在所有列中添加一个带有代码“LazyLoadCheck”部分的CellFactory


希望我把自己说清楚了,能帮上忙!如果还有任何问题,请发表评论,我将尝试做更好的解释。

自己实现表视图分页并分块加载数据。是否已经开发了在Java或JavaFx中实现这一点的库或API?可能有第三方API用于Swing,但也可能没有JavaFx。这实际上取决于你的环境。例如,JPA具有分页查询等功能。视图部分并不难实现。JavaFX具有内置功能,但(对于JavaFX2.2而言)核心(或我所知的第三方库)中没有将分页控件与JavaFX TableView挂钩的代码,因此您需要自己处理该部分。感谢大家的意见,我想等甲骨文公司的人是没有用的。我应该自己实施。再次感谢1!