显示 table header 的上下文菜单并获取列索引?

Show context menu for table header and get column index?

是否可以在 table 列的 header 上显示上下文菜单并获取所选列的索引?

return table 中所选列的索引一直有问题。

如何做到这一点?

这里有一些代码可以打印被点击的 TableColumn header:

public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    Table table = new Table(shell, SWT.NONE);
    table.setHeaderVisible(true);

    for (int i = 0; i < 3; i++)
    {
        new TableColumn(table, SWT.NONE).setText("Column " + i);
    }

    for (int j = 0; j < 10; j++)
    {
        TableItem item = new TableItem(table, SWT.NONE);
        for (int i = 0; i < table.getColumnCount(); i++)
        {
            item.setText(i, "Cell " + j + " " + i);
        }
    }

    for (int i = 0; i < table.getColumnCount(); i++)
    {
        table.getColumn(i).pack();
    }

    table.addListener(SWT.MenuDetect, e ->
    {
        Point pt = Display.getCurrent().map(null, table, new Point(e.x, e.y));
        Rectangle clientArea = table.getClientArea();
        boolean headerClicked = (clientArea.y <= pt.y && pt.y < (clientArea.y + table.getHeaderHeight()));

        if (headerClicked)
        {
            int xOffset = 0;
            for (int colIdx : table.getColumnOrder())
            {
                int colWidth = table.getColumn(colIdx).getWidth();

                if (xOffset <= pt.x && pt.x < (xOffset + colWidth))
                {
                    System.out.println(table.getColumn(colIdx).getText());    // Your code goes here
                    break;
                }
                xOffset += colWidth;
            }
        }
    });

    shell.pack();
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
        {
            display.sleep();
        }
    }
}

如果需要索引,请使用colIdx

Showing a right click menu for a SWT Table header to get the column name or index.

SWT.MenuDetect:当检测到用于显示菜单项的依赖于平台的触发器时发送。

table.addListener(SWT.MenuDetect,new Listener() {
        @Override
        public void handleEvent(Event e) {
            Point ptAbsolute = new Point(e.x, e.y);
            Point pt = table.toControl(ptAbsolute); 
            int colIndex = columnAtPoint(table, pt);
            if (colIndex >= 0) {
                if (pt.y < table.getHeaderHeight())  {  
                    // Negative Y means table header

                    System.out.println("Column name is " + table.getColumn(colIndex).getText());
                } 
                else {
                    System.out.println("Row right-clicked on column name is " + table.getColumn(colIndex).getText());
                }
            }
        }
});

Class Point : 表示 (x,y) 坐标 space 中的位置的点,以整数精度指定。

private static int columnAtPoint(Table table, Point pt) {
    int colIndex = -1;

    TableItem fakeRow = new TableItem(table, 0);
    for (int i = 0; i < table.getColumnCount(); i++) {
        Rectangle rec = fakeRow.getBounds(i);
        if ((pt.x > rec.x)  && (pt.x < (rec.x + rec.width))) {
            colIndex = i;
        }
    }
    fakeRow.dispose();
    return colIndex;
}