显示表头的上下文菜单并获取列索引?

时间:2017-04-26 10:01:05

标签: java swt

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

我遇到问题时返回表格中所选列的索引。

  • table.getSelectionIndex()返回-1
  • Point point = new Point(event.x, event.y)返回点{0,0}

如何做到这一点?

2 个答案:

答案 0 :(得分:3)

以下是一些代码,用于打印单击的TableColumn标题:

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

答案 1 :(得分:1)

  

显示SWT表标题的右键菜单以获取列名称或索引。

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());
                }
            }
        }
});

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

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;
}