2016-06-09 7 views
1

Ich zeige eine Image auf einem Canvas. Wenn der Benutzer mit der rechten Maustaste auf die Zeichenfläche klickt, wird ein Kontextmenü angezeigt.Pop-up-Menü auf Canvas: nur innerhalb bestimmter Grenzen anzeigen

Wie zeige ich das Menü nur an, wenn der Benutzer innerhalb der Grenzen des Bildes geklickt hat? Ich kann die x und y Position von der Veranstaltung bekommen, aber sicher ist es zu diesem Zeitpunkt zu spät!

final Menu pixelContextMenu = new Menu(canvas); 
canvas.setMenu(pixelContextMenu); 

final MenuItem resetImageItem = new MenuItem(pixelContextMenu, SWT.NONE); 
resetImageItem.setText("Reset Image"); 
resetImageItem.addListener(SWT.MenuDetect, new Listener() { 
    @Override 
    public void handleEvent(Event event) { 
     int x = event.x; 
     int y = event.y; 
    } 
}); 
+0

Entfernen Sie es nur vorübergehend und sehen, ob es dann funktioniert. – Baz

Antwort

2

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(); 
} 
+0

Brilliant! Lieben Sie es nicht, wenn sich eine Bibliothek so verhält, wie Sie es erwarten :) –

+0

Tatsächlich glaube ich, dass hier ein Fehler auftritt, da das Ereignis ausgeführt wird, wenn der Benutzer mit der rechten Maustaste auf die Zeichenfläche klickt und nicht auf den Menüeintrag –

+0

@Robben_Ford_Fan_boy Nun, das war Ihre Frage: "Ich zeige das Menü nur an, wenn der Benutzer innerhalb der Grenzen des Bildes geklickt hat?". Das habe ich zur Verfügung gestellt. Jedenfalls habe ich meine Antwort mit einer Alternative aktualisiert. Vielleicht suchen Sie das. – Baz

Verwandte Themen