是否可以在表列的标题上显示上下文菜单并获取所选列的索引?
我遇到问题时返回表格中所选列的索引。
table.getSelectionIndex()
返回-1
Point point = new Point(event.x, event.y)
返回点{0,0} 如何做到这一点?
答案 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;
}