Verwenden Event#doit
und setzen Sie ihn auf false
, wenn das Ereignis außerhalb Ihrer Nähe. Hier ist ein Beispiel, das das Menü auf der linken Hälfte zeigen würde, aber nicht die rechte Hälfte der 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();
}
Wenn Sie die Menu
in jedem Fall zeigen wollen, aber einige Menüpunkte deaktivieren basierend an der Ereignisposition, dann tun Sie dies:
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();
}
Entfernen Sie es nur vorübergehend und sehen, ob es dann funktioniert. – Baz