通过 MenuItem 触发方法

Trigger a method through a MenuItem

我试图通过单击 MenuItem 来调用方法,因此(基本上)打开了另一个 window。

我的标准方法是使用这个:

        mntmAbout.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            About.main(null);
            }
        };

其中 mntmAboutMenuItem。但是,这是不可能的,因为 eclipse 警告我 addActionListener 不是 MenuItem.

类型的已知方法

整个 class 是通过在 WindowBuilder 中设计一个 UI 构建的,所以我想这个功能需要不同的方法,因为我正在处理一个 MenuItemJMenuItem。 (或者我在这里错过了完全不同的东西)

class 的完整来源:

package kingfisher;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.SWT;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import java.awt.event.*;


public class ControlPanel {

    protected Shell shell;

    /**
     * Launch the application.
     * @param args
     */
    public static void main(String[] args) {
        try {
            ControlPanel window = new ControlPanel();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Open the window.
     */
    public void open() {
        Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    /**
     * Create contents of the window.
     */
    protected void createContents() {
        shell = new Shell();
        shell.setSize(450, 300);
        shell.setText("Control Panel");

        CLabel lblNewLabel = new CLabel(shell, SWT.NONE);
        lblNewLabel.setImage(SWTResourceManager.getImage(ControlPanel.class, "/kingfisher/rsz_1rsz_icon.png"));
        lblNewLabel.setBounds(97, 10, 256, 200);
        lblNewLabel.setText("");

        Label lblNewLabel_1 = new Label(shell, SWT.SHADOW_IN | SWT.CENTER);
        lblNewLabel_1.setBounds(194, 216, 61, 17);
        lblNewLabel_1.setText("Kingfisher");

        Menu menu = new Menu(shell, SWT.BAR);
        shell.setMenuBar(menu);

        MenuItem mntmControl = new MenuItem(menu, SWT.CASCADE);
        mntmControl.setText("Control");

        Menu menu_1 = new Menu(mntmControl);
        mntmControl.setMenu(menu_1);

        MenuItem mntmQuit = new MenuItem(menu_1, SWT.NONE);
        mntmQuit.setText("Quit");

        MenuItem mntmWindows = new MenuItem(menu, SWT.CASCADE);
        mntmWindows.setText("Windows");

        Menu menu_2 = new Menu(mntmWindows);
        mntmWindows.setMenu(menu_2);

        MenuItem mntmChat = new MenuItem(menu_2, SWT.NONE);
        mntmChat.setText("Chat");

        MenuItem mntmContacts = new MenuItem(menu_2, SWT.NONE);
        mntmContacts.setEnabled(false);
        mntmContacts.setText("Contacts");

        MenuItem mntmSettings = new MenuItem(menu_2, SWT.NONE);
        mntmSettings.setEnabled(false);
        mntmSettings.setText("Settings");

        MenuItem mntmHelp = new MenuItem(menu, SWT.CASCADE);
        mntmHelp.setText("Help");

        Menu menu_3 = new Menu(mntmHelp);
        mntmHelp.setMenu(menu_3);

        MenuItem mntmAbout = new MenuItem(menu_3, SWT.NONE);
        //HERE BE CODE
        mntmAbout.setText("About");

    }
}

SWT 和 Swing 是不同的工具包。他们使用不同的事件队列和侦听器类型。检查 JavaDoc.

对于 SWT,您使用 addSelectionListener

mntmAbout.addSelectionListener(new SelectionAdapter() {
  @Override
  public void widgetSelected(final SelectionEvent event)
  {
    // TODO Your code
  }
});

SWT 是与 Swing/AWT 完全不同的工具包,不使用任何 java.awt 代码。