带有多个JTable的大型JScrollPane - 如何分页

时间:2014-01-15 06:17:12

标签: java swing pagination jtable jscrollpane

我一直试图谷歌这个,但大多数人都会问一个大单桌的问题,我的问题有点不同。

很抱歉,我无法提供正常工作的代码,我的程序有点复杂,但是如果有人能指出我的方向,那就试着寻找解决方案。

简而言之,我有一个非常大的文本文件,我读取并为每一行创建对象,例如HeaderRecord或ClaimDetail等。当前文件最终有大约60,000个对象。然后,我为每条记录创建JTable,迭代它们,然后将它们添加到我的滚动窗格中。

它工作得很好,我的问题是将这些数据加载到内存中需要很多! (明显)。但即使忽略了这一点,在加载数据并且屏幕弹出后它仍然停留了一分钟,可能试图绘制所有这些是窗格。

我能想到的唯一解决方案是以某种方式对显示进行分页。一次只能拉入一定数量的JTable。我不知道怎么回事!如果有人可以帮我提出看什么的建议我真的很感激

由于

更新:我实现了这样的一个swingworker:

private class TableRun extends SwingWorker<Void, JTable> {
        private ArrayDeque<FileRecord> fileRecords;
        private final GridBagConstraints gc;
        private final JPanel parentPanel;
        int counter = 1;
        TableRun(ArrayDeque<FileRecord> fileRecords, GridBagConstraints gc, JPanel parentPanel) {
            this.fileRecords = fileRecords;
            this.gc = gc;
            this.parentPanel = parentPanel;
        }
        @Override
        protected Void doInBackground() {
            Iterator<FileRecord> iterator = fileRecords.iterator();
            while (iterator.hasNext()) {
                publish(getTabel(iterator.next()));
                Thread.yield();
            }
            return null;
        }
        @Override
        protected void process(final List<JTable> tables) {
                    Iterator<JTable> iterator = tables.iterator();
                    while(iterator.hasNext()) {
                        JTable table = iterator.next();
                        gc.fill = 1;
                        parentPanel.add(table.getTableHeader(), gc);
                        gc.gridy++;
                        parentPanel.add(table,gc);
                        gc.gridy++;
                        System.out.println("Sequence Nr : " + table.getModel().getValueAt(0,1) + " - Counter :" + counter++);
                    }
        }
    }

似乎很有用......我的问题是在我的JFrame构造函数中设置了

this.setExtendedState(JFrame.MAXIMIZED_BOTH);

所以框架在整个屏幕上打开。我想要的是当swingworker完成将JTable添加到我的面板中的过程方法时,它应该将这些表添加到面板并显示它们。所以它应该显示,直到整个文件被读取为止。这不会发生。事实上,显示器只是保持空白,直到我调整框架大小,然后它实际显示表格。

我试图从进程方法中调用Outerclass.this.repaint()来抢夺我的Jframe但是没有用...

有什么建议吗?

由于

2 个答案:

答案 0 :(得分:3)

超出SO范围的完整设计,但这是一个大纲:

  • 在阅读源数据时使用SwingWorker来管理延迟;在他们到达的doInBackground()publish()记录的实施中解析数据;即使剩下的记录可能需要一些时间,但前几个记录会立即可见。

  • 创建一个主JTable,其模型包含每个Record的行; JTable渲染甚至可以为数千行提供有效的滚动;此表只需要向用户显示select the desired rows(s)

  • 的足够信息
  • ListSelectionListener添加到主表中;在侦听器中,使用主行中的详细信息更新相邻的JTable;使用setModel()(图示here)更新详细信息表。

答案 1 :(得分:0)

这是一个现实生活中的问题,我将在所有JTable上缓冲方向。在我的场景中,我有超过50k的JTable,单个实例化占用了超过40分钟的CPU时间。 Swing搞砸了。

我所说的方法是创建一个缓冲区,其中包含一定数量的JTable,这些JTables是以当前父容器currentSize()为单位计算的。我建议你上下创建4或5套JTable,以获得良好的性能。如果用户积极地滚动滚动,他将得到一个不可避免的延迟,就像每个JTable中的组件一样重。

现在它出现了不好的部分......你必须将滚动与缓冲区大小同步。当你向上或向下滚动时,你将管理缓冲区大小创建和销毁JTables,并希望以一种有效的方式收集收集器。

这听起来有点复杂但是我能想象的唯一可靠的解决方案。

祝你好运,玩得开心!