gpt4 book ai didi

java - 具有多个 JTable 的大型 JScrollPane — 如何分页

转载 作者:行者123 更新时间:2023-12-01 23:16:27 24 4
gpt4 key购买 nike

我一直在尝试用谷歌搜索这个问题,但大多数人都会问与大型单个表相关的问题,我的问题有点不同。

抱歉,我无法提供工作代码,我的程序有点复杂,但是如果有人能给我指明方向,我会尝试找到解决方案。

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

效果很好,我的问题是将此数据加载到内存中需要很多时间! (明显地)。但即使忽略这一点,在数据加载和屏幕弹出后,它仍然卡住了一分钟左右,可能试图绘制所有这些是 Pane 。

我能想到的唯一解决方案是以某种方式对显示进行分页。一次只拉取一定数量的 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 添加到我的面板时,它应该将这些表添加到面板并显示它们。因此它应该显示,因为它会一直显示它们,直到读取整个文件。这不会发生。事实上,显示只是保持空白,直到我调整框架大小,然后它实际上显示表格。

我尝试从 process 方法中调用 Outerclass.this.repaint() 来重新绘制我的 Jframe,但这不起作用...

有什么建议吗?

谢谢

最佳答案

完整的设计超出了 SO 的范围,但这里有一个概要:

  • 使用SwingWorker管理读取源数据时的延迟;在 doInBackground()publish() 记录到达时解析它们的实现;前几条记录将立即可见,尽管其余记录可能需要一些时间。

  • 创建一个主JTable,其模型包含每个记录的一行; JTable 渲染即使对于数千行也能提供高效的滚动;该表只需要显示足够的信息供用户select the desired rows(s) .

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

关于java - 具有多个 JTable 的大型 JScrollPane — 如何分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21130354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com