gpt4 book ai didi

java - 超过 200 列的 SWT 表无法正确呈现

转载 作者:搜寻专家 更新时间:2023-11-01 02:49:34 25 4
gpt4 key购买 nike

在我们的 Eclipse RCP 3.7 应用程序中,我们加载 Excel 文件并在表格中显示前 30 行,渲染问题不在于行,而在于列数,当它达到一定大小时表格似乎没有正确绘制,当您向右滚动时,单元格和标题会失去对齐,整个事情变得疯狂。

下面的独立类演示了这个问题,并遵循我在我的应用程序中使用的基本模式,以防出现问题。

关于如何解决这个问题有什么想法吗?

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;



public class Snippet {

public static TableViewer viewer;

public static void main( String[] args ) {
Display display = new Display();
Shell shell = new Shell( display );
shell.setLayout( new FillLayout() );
viewer = new TableViewer(shell, SWT.FULL_SELECTION | SWT.H_SCROLL
| SWT.V_SCROLL);
Table table = viewer.getTable();
table.setLinesVisible(true);
table.setHeaderVisible(true);

viewer.setContentProvider(new ArrayContentProvider());
createColumns(300);
viewer.setInput(generateData(300, 30));
for (TableColumn c : viewer.getTable().getColumns()) {
c.pack();
}


shell.setSize( 300, 500 );
shell.open();
while( !shell.isDisposed() ) {
if( !display.readAndDispatch() ) {
display.sleep();
}
}
display.dispose();
}

private static void createColumns(int columnCount) {

for (int i = 0; i < columnCount; i++) {
createTableViewerColumn(i);

}
}

private static TableViewerColumn createTableViewerColumn(int colNum) {
final TableViewerColumn viewerColumn = new TableViewerColumn(viewer,
SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
column.setText("Table Header " + colNum);
column.setWidth(100);
column.setResizable(true);
column.setMoveable(false);
viewerColumn.setLabelProvider(new Snippet.SampleDataTableCellProvider(colNum));
return viewerColumn;
}

private static List<String[]> generateData(int cols, int rows) {
ArrayList<String[]> result = new ArrayList<String[]>();
for (int y = 0; y < rows; y++) {
String[] row = new String[cols];
for (int x = 0; x < cols; x++) {
row[x] = "Big long string to test how long these columns can go before it all goes mental.";
}
result.add(row);
}
return result;
}

private static class SampleDataTableCellProvider extends StyledCellLabelProvider {

private int colnumber;

private SampleDataTableCellProvider(int colnumber) {
this.colnumber = colnumber;
}

@Override
public void update(ViewerCell cell) {

String[] row = (String[]) cell.getElement();
if (row.length > colnumber) {
cell.setText(row[colnumber]);
} else {
cell.setText("");
}

super.update(cell);
}


}
}

最佳答案

我猜 TableViewer 在滚动时无法足够快地更新和呈现内容。

您可以尝试查看 JFace 查看器的 SWT.VIRTUAL 样式和惰性内容提供程序。

来自 TableViewer 的 javadoc :

As of 3.1 the TableViewer now supports the SWT.VIRTUAL flag. If the underlying table is SWT.VIRTUAL, the content provider may implement ILazyContentProvider instead of IStructuredContentProvider .

具有SWT.VIRTUAL 样式的TableViewer 可以使用ILazyContentProvider 按需创建和显示内容。有关使用虚拟查看器的一些副作用,请参阅 javadoc,例如对排序或过滤的限制。

另请参阅此博客条目:JFace’s Viewers Performances .

由于标准 TableViewer 缓存行而不是列,Nebula GridTableViewer 似乎更适合处理大量列的问题。它通知可见单元格,并可与 LazyColumnLabelProvider 一起使用。

有关使用 Nebula GridTableViewer 的解决方案,请参阅本文:JFace-Viewer and Eclipse Databinding with > 10.000 Objects .

关于java - 超过 200 列的 SWT 表无法正确呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13958709/

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