2016-06-09 31 views
1

我在Canvas上顯示Image。當用戶右鍵單擊畫布時,會顯示一個上下文菜單。畫布上的彈出菜單:僅在特定邊界內顯示

如果用戶在圖像邊界內單擊,我該如何顯示菜單?我可以從事件中獲得xy的位置,但肯定在這一點上已經太遲了!

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

只是暫時刪除它,看看它是否工作。 – Baz

回答

2

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

輝煌!當圖書館的行爲像你期望的那樣時,你不喜歡它:) –

+0

其實,我相信這裏有一個錯誤,因爲事件將在用戶右鍵單擊畫布時執行,而不是當他們單擊菜單項時 –

+0

@Robben_Ford_Fan_boy那麼,這是你的問題:「如果用戶在圖像的範圍內點擊,我只顯示菜單」。這就是我所提供的。無論如何,我用一個替代方案更新了我的答案。也許這就是你要找的。 – Baz