Спасибо за ваш пример, это очень помогло. Поскольку мне действительно нужно было знать, какой заголовок столбца был нажат, я основался на вашем коде и пришел к следующему решению (которое также работает в случае, если перетаскивание исходного порядка столбцов было изменено):
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
public class TreeColumnHeaderMenuDetectListener implements MenuDetectListener {
private Tree fTree;
private TreeViewer fTreeViewer;
public TreeColumnHeaderMenuDetectListener(TreeViewer treeViewer)
{
fTree = treeViewer.getTree();
fTreeViewer = treeViewer;
}
@Override
public void menuDetected(MenuDetectEvent event) {
Point curLoc = Display.getCurrent().map(null, fTreeViewer.getControl(), new Point(event.x, event.y));
Rectangle clientArea = fTree.getClientArea();
if (clientArea.y <= curLoc.y && curLoc.y < (clientArea.y + fTree.getHeaderHeight()) &&
clientArea.x <= curLoc.x && curLoc.x < (clientArea.x + clientArea.width)) {
int xOffset = 0; // Accumulates previous column widths
for (int colIdx : fTree.getColumnOrder()) {
int colWidth = fTree.getColumn(colIdx).getWidth();
// Check if cursor location lies within the current column
if (xOffset <= curLoc.x && curLoc.x < (xOffset + colWidth)) {
System.out.println("column header "+colIdx); // Your code goes here
break;
}
xOffset += colWidth;
}
}
}
}
Используйте его, зарегистрировавшись на
tree.addMenuDetectListener(new TreeColumnHeaderMenuDetectListener(treeViewer))
для данного дерева и соответствующего treeViewer.