Lin*_*k19 4 java eclipse rcp swt
在我们的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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想TableViewer在滚动时无法更新并快速呈现内容.
您可以尝试查看SWT.VIRTUALJFace查看器的样式和延迟内容提供程序.
从TableViewer的javadoc :
从3.1开始,TableViewer现在支持SWT.VIRTUAL标志.如果基础表是SWT.VIRTUAL,则内容提供者可以实现ILazyContentProvider而不是IStructuredContentProvider.
TableViewer具有SWT.VIRTUAL样式的A 可以使用ILazyContentProvider按钮创建和显示内容.有关使用虚拟查看器的一些副作用,请参阅javadoc,例如对排序或过滤的限制.
另请参阅此博客条目:JFace的查看器性能.
由于标准TableViewer缓存行而不是列,因此星云GridTableViewer似乎更适合处理大量列的问题.它通知可见细胞,可与a一起使用LazyColumnLabelProvider.
有关使用星云的解决方案,GridTableViewer请参阅本文:JFace-Viewer和带有> 10.000对象的Eclipse数据绑定.
| 归档时间: |
|
| 查看次数: |
1743 次 |
| 最近记录: |