【问题标题】:Java SWT: Why does the MenuItem listener not get executed on a CanvasJava SWT:为什么 MenuItem 侦听器不在 Canvas 上执行
【发布时间】:2016-10-12 16:11:55
【问题描述】:

为什么 MenuItem 侦听器没有在 Canvas 上执行?请参阅下面的测试程序。您可能希望将“Got Here”打印到控制台。

import java.util.ArrayList;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;


public class MenuListenerTest {
    //BufferedImage bitmapImage = null;
    Image image = null;
    Canvas canvas = null;
          private void createContents(Shell shell) {

              shell.setLayout(new FillLayout());

            // Create a canvas to draw on
            canvas = new Canvas(shell, SWT.V_SCROLL | SWT.H_SCROLL | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED);

            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;
                    System.out.println("Got here");
                }
            });

          }
          public static void main(String[] args) 
            {
                new MenuListenerTest().run();
            }

             public void run() {
                    Display display = new Display();
                    Shell shell = new Shell(display);
                    createContents(shell);
                    shell.open();
                    while (!shell.isDisposed()) {
                      if (!display.readAndDispatch()) {
                        display.sleep();
                      }
                    }
                    display.dispose();
                  }

                  /**
                   * Creates the main window's contents
                   * 
                   * @param shell the main window
                   */            
}

【问题讨论】:

  • 您希望在菜单可见或按下MenuItem 时触发事件?
  • @LorisSecuro 当 MenuItem 被按下时

标签: java canvas swt listener


【解决方案1】:

MenuItem被按下时,你应该使用SelectionListener来拦截:

resetImageItem.addSelectionListener(new SelectionAdapter() {

    @Override
    public void widgetSelected(SelectionEvent event) {
        System.out.println("menu item pressed");
    }

});

当菜单可见时,事件SWT.MenuDetect 会被触发。要拦截它,您必须将侦听器直接附加到Canvas

canvas.addListener(SWT.MenuDetect, new Listener() {

    @Override
    public void handleEvent(Event event) {
        System.out.println("menu visible");
    }

});

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 2012-12-19
    • 1970-01-01
    • 2012-03-19
    • 2015-08-21
    • 1970-01-01
    • 2011-01-16
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多