显示 table header 的上下文菜单并获取列索引?
Show context menu for table header and get column index?
是否可以在 table 列的 header 上显示上下文菜单并获取所选列的索引?
return table 中所选列的索引一直有问题。
table.getSelectionIndex()
returns -1
Point point = new Point(event.x, event.y)
returns 点{0, 0}
如何做到这一点?
这里有一些代码可以打印被点击的 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;
}
是否可以在 table 列的 header 上显示上下文菜单并获取所选列的索引?
return table 中所选列的索引一直有问题。
table.getSelectionIndex()
returns-1
Point point = new Point(event.x, event.y)
returns 点{0, 0}
如何做到这一点?
这里有一些代码可以打印被点击的 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;
}