我一直试图谷歌这个,但大多数人都会问一个大单桌的问题,我的问题有点不同。
很抱歉,我无法提供正常工作的代码,我的程序有点复杂,但是如果有人能指出我的方向,那就试着寻找解决方案。
简而言之,我有一个非常大的文本文件,我读取并为每一行创建对象,例如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但是没有用...
有什么建议吗?
由于
答案 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,并希望以一种有效的方式收集收集器。
这听起来有点复杂但是我能想象的唯一可靠的解决方案。
祝你好运,玩得开心!