2009-06-04 71 views
1

我使用TableViewer在表中显示信息。用户可以通过选择表格的一行来选择显示的选项之一。显示TableViewer不在行,但按矩阵顺序

我想创建一个矩阵形式的表,其中用户不仅可以选择线。应该可以选择表格的每个项目,如第2行第3列。对于每个项目选择,将调用一个操作来处​​理该项目,就像它在TableViewer中一样。

就我而言,我可以将CellModifier和CellEditor添加到表的行中,但操作的引用始终是行对象而不是选定的TableItem。

有人有一个例子如何在Composite中创建这样的矩阵吗? 我可以通过设置一个GridLayout并在for循环中添加组件来创建它,但比我遇到问题时,当我想重新绘制与新的儿童组合。 TableViewer已经有了这个处理,所以我不想再实现它。

回答

2

前段时间我遇到了同样的问题,我发现解决这个问题的唯一方法是在与表查看器关联的SWT表部件上注册一个鼠标侦听器。

MouseListener columnSelectionMouseListener = new ColumnSelectionMouseListener(); 
getViewer().getTable().addMouseListener(columnSelectionMouseListener); 

public class ColumnSelectionMouseListener implements MouseListener { 

    private TableColumn selectedColumn; 

    @Override 
    public void mouseDoubleClick(MouseEvent e) { 
     // Nothing to do here 
    } 

    @Override 
    public void mouseDown(MouseEvent e) { 
     table = (Table) e.widget; 
    TableItem item = table.getItem(new Point(e.x, e.y)); 
    for (int i = 0; i < table.getColumnCount(); i++) { 
     TableColumn column = table.getColumn(i); 
     Rectangle bounds = item.getBounds(i); 
     if (bounds.contains(e.x, e.y)) { 
      selectedColumn = column; 
     } 
    } 
    } 

    @Override 
    public void mouseUp(MouseEvent e) { 
     // Nothing to do here 
    } 

    public TableColumn getSelectedField() { 
      return selectedColumn; 
    } 
} 

然后,例如在观众的选择监听器,你可以问到鼠标监听器,列当鼠标被按下,并结合起来,与所选择的线路从观众的选择来进行适当的选择行动。

希望这可以帮助。

马努