代码之家  ›  专栏  ›  技术社区  ›  Markus Lausberg

不按行显示TableViewer,而是按矩阵顺序显示

  •  1
  • Markus Lausberg  · 技术社区  · 15 年前

    TableViewer 在表格中显示信息。用户可以通过选择表格的一行来选择显示的选项之一。

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

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

    有人举过一个例子,如何在复合材料中创建这样一个矩阵吗? 我可以通过设置GridLayout并在for循环中添加组件来创建它,但是当我想用新的子对象重新绘制复合图时,我会遇到问题。TableViewer已经有了这个处理,所以我不想再次实现它。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Manuel Selva    15 年前

    不久前我也遇到了同样的问题,我发现解决这个问题的唯一方法是在与表查看器关联的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;
        }
    }
    

    然后,例如,在查看器的选择侦听器中,您可以向鼠标侦听器询问在按下鼠标时选择了哪一列,并将该列与来自查看器选择的选定行相结合,以执行适当的操作。

    希望这能有所帮助。

    马努

        2
  •  0
  •   Ingo Ingo    15 年前

    下面的JFace代码片段可能会有所帮助: Snippet058CellNavigationIn34

    英戈