使用Event#doit
並將其設置爲false
如果事件是你的區域之外。下面是會顯示在左半菜單中的例子,但不是Canvas
的右半部分:
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Stackoverflow");
shell.setLayout(new FillLayout());
final Canvas canvas = new Canvas(shell, SWT.NONE);
Menu menu = new Menu(canvas);
new MenuItem(menu, SWT.NONE).setText("MenuItem");
canvas.setMenu(menu);
canvas.addListener(SWT.MenuDetect, new Listener()
{
@Override
public void handleEvent(Event event)
{
Point location = canvas.toControl(event.x, event.y);
if(location.x > canvas.getBounds().width/2f)
event.doit = false;
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
如果你想顯示在任何情況下Menu
,但禁用基於某些菜單項在活動的位置,然後這樣做:
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Stackoverflow");
shell.setLayout(new FillLayout());
final Canvas canvas = new Canvas(shell, SWT.NONE);
Menu menu = new Menu(canvas);
final MenuItem item = new MenuItem(menu, SWT.NONE);
item.setText("MenuItem");
canvas.setMenu(menu);
canvas.addListener(SWT.MenuDetect, new Listener()
{
@Override
public void handleEvent(Event event)
{
Point location = canvas.toControl(event.x, event.y);
item.setEnabled(location.x <= canvas.getBounds().width/2f);
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
來源
2016-06-09 15:23:31
Baz
只是暫時刪除它,看看它是否工作。 – Baz