如何在SWT表中隐藏/删除列

时间:2011-06-28 20:41:59

标签: java swt

使用哪种方法来隐藏/删除SWT中的列(特别是在Eclipse插件中)?

  1. A无法将此功能传输到行,因为我需要插入和隐藏(或删除)行和列。
  2. 我尝试使用TableColumn.dispose()删除它们,但是根据布局中的ColumnWeightData没有删除,并且使用新的TableLayout重置整个表格布局没有删除有关布局中列的信息。
  3. 我尝试创建所有需要的列,并使用setWidth(0)隐藏应隐藏/删除的列。我写的示例代码是here。这种方法并不好: 3.1。它不会扩展。在我的情况下,列的最大数量可能是几千,用户实际上只需要很少。 3.2。处理大小调整真的是一个地狱。即使在setResizable(false)列之后,如果调整父组件的大小,也可以调整AFAIU的大小。为了解决这个问题,我需要为父组件编写大量的监听器。我还没试过。
  4. 我应该

    1. 调查进一步处理表格列并使用它?
    2. 使用setWidth(0)堆栈一段时间,因为我还没有遇到扩展问题?
    3. 看一下第三方桌面组件的方向(Nattable ......)? - 如果是,最好是开源的,因为我的Eclipse插件是开源的。

2 个答案:

答案 0 :(得分:21)

我们在这里的许多表格上都这样做。

首先,我们确保用户看不到我们正在做什么。

table.setRedraw( false );

然后我们删除所有列。

while ( table.getColumnCount() > 0 ) {
    table.getColumns()[ 0 ].dispose();
}

然后我们添加所需的那些。

ArrayList<Column> columns = getShownColumns();

for ( Column column : columns ) {
    TableColumn tableColumn = new TableColumn( table, column.getStyle() );
    tableColumn.setText( column.getTitle() );
    tableColumn.setWidth( column.getWidth() );
}

最后我们让用户看看我们做了什么。

table.setRedraw( true );

答案 1 :(得分:3)

我每次只使用可见列重新创建表格列。如果使用SWT.VIRTUAL样式位,则速度相当快。设置table.setRedraw(false),从表中删除数据,处理所有TableColumns,重新创建必要的数据并重新设置数据。然后设置table.setRedraw(true)。这可以最大限度地减少闪烁。

我做了所有这些,它工作正常,TableColumns的处理按预期工作。

尽管如此,使用SWT.VIRTUAL不是为了胆小的人。它暗示了对表的不同处理。你可以先试试,看它是否足够快。

拥有一个包含数千列的表格,只向用户显示一些内容对我来说非常奇怪。使用原生Table实现,我预计会遇到问题。