返回介绍

Menus & toolbars in Java SWT

发布于 2025-02-22 22:19:34 字数 15644 浏览 0 评论 0 收藏 0

In this part of the Java SWT tutorial, we work with menus & toolbars.

A menubar is a common part of a GUI application. It is a group of commands located in various menus.

Simple menu

In our first example, we create a menubar with one file menu. The menu has only one menu item. By selecting the item the application ends.

SimpleMenuEx.java

package com.zetcode;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;

/**
 * ZetCode Java SWT tutorial
 *
 * This program creates a simple menu.
 * 
 * Author: Jan Bodnar
 * Website: zetcode.com
 * Last modified: June 2015
 */

public class SimpleMenuEx {

  public SimpleMenuEx(Display display) {

    initUI(display);
  }

  private void initUI(Display display) {

    Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);

    Menu menuBar = new Menu(shell, SWT.BAR);
    MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);
    cascadeFileMenu.setText("&File");
    
    Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
    cascadeFileMenu.setMenu(fileMenu);

    MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
    exitItem.setText("&Exit");
    shell.setMenuBar(menuBar);
    
    exitItem.addListener(SWT.Selection, event-> {
      shell.getDisplay().dispose();
      System.exit(0);
    });

    shell.setText("Simple menu");
    shell.setSize(300, 200);
    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
      display.sleep();
      }
    }
  }

  @SuppressWarnings("unused")
  public static void main(String[] args) {

    Display display = new Display();
    SimpleMenuEx ex = new SimpleMenuEx(display);
    display.dispose();
  }
}

This is a small example with minimal menubar functionality.

Menu menuBar = new Menu(shell, SWT.BAR);

Passing the SWT.BAR option to the Menu creates a menu bar.

MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);
cascadeFileMenu.setText("&File");

Top-level menu items are cascade menu items; they receive the SWT.CASCADE option.

Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
cascadeFileMenu.setMenu(fileMenu);

Drop down menus are created with the SWT.DROP_DOWN option.

MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
exitItem.setText("&Exit");

A push menu item is plugged into a drop down menu. It is created with the SWT.PUSH option.

shell.setMenuBar(menuBar);

The setMenuBar() sets a menu bar to the shell.

exitItem.addListener(SWT.Selection, event-> {
  shell.getDisplay().dispose();
  System.exit(0);
});

When we select the exit push menu item, the application is terminated.

Simple menu
Figure: Simple menu

Submenu

The next example demonstrates how to create a submenu.

SubMenuEx.java

package com.zetcode;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;

/**
 * ZetCode Java SWT tutorial
 *
 * This program creates a submenu.
 *
 * Author: Jan Bodnar
 * Website: zetcode.com
 * Last modified: June 2015
 */

public class SubMenuEx {

  public SubMenuEx(Display display) {

    initUI(display);
  }

  private void initUI(Display display) {
    
    Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);

    Menu menuBar = new Menu(shell, SWT.BAR);
    MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);
    cascadeFileMenu.setText("&File");

    Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
    cascadeFileMenu.setMenu(fileMenu);

    MenuItem cascadeEditMenu = new MenuItem(menuBar, SWT.CASCADE);
    cascadeEditMenu.setText("&Edit");

    MenuItem subMenuItem = new MenuItem(fileMenu, SWT.CASCADE);
    subMenuItem.setText("Import");

    Menu submenu = new Menu(shell, SWT.DROP_DOWN);
    subMenuItem.setMenu(submenu);

    MenuItem feedItem = new MenuItem(submenu, SWT.PUSH);
    feedItem.setText("&Import news feed...");

    MenuItem bmarks = new MenuItem(submenu, SWT.PUSH);
    bmarks.setText("&Import bookmarks...");

    MenuItem mailItem = new MenuItem(submenu, SWT.PUSH);
    mailItem.setText("&Import mail...");

    MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
    exitItem.setText("&Exit");
    shell.setMenuBar(menuBar);

    exitItem.addListener(SWT.Selection, event-> {
      shell.getDisplay().dispose();
      System.exit(0);
    });
    
    shell.setText("Submenu");
    shell.setSize(300, 250);
    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }    
  }

  @SuppressWarnings("unused")
  public static void main(String[] args) {
    
    Display display = new Display();
    SubMenuEx ex = new SubMenuEx(display);
    display.dispose();
  }
}

The example creates a menu inside another menu.

MenuItem subMenuItem = new MenuItem(fileMenu, SWT.CASCADE);
subMenuItem.setText("Import");

A submenu creation is similar to creating a normal menu. First, we create a cascade menu item. The only difference is the parent widget. This time the parent is the menu object, to which the submenu belongs.

MenuItem feedItem = new MenuItem(submenu, SWT.PUSH);
feedItem.setText("&Import news feed...");

We create a push menu item. The parent widget is the submenu object.

Submenu
Figure: Submenu

CheckMenuItem

CheckMenuItem is a menu item with a check box. It can be used to work with boolean properties.

CheckMenuItemEx.java

package com.zetcode;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;

/**
 * ZetCode Java SWT tutorial
 *
 * This program creates a check menu item.
 * It will show or hide a statusbar.
 *
 * Author: Jan Bodnar
 * Website: zetcode.com
 * Last modified: June 2015
 */

public class CheckMenuItemEx {

  private Shell shell;
  private Label status;
  private MenuItem statItem;

  public CheckMenuItemEx(Display display) {

    initUI(display);
  }
  
  public void initUI(Display display) {
    
    shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);

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

    MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);
    cascadeFileMenu.setText("&File");

    Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
    cascadeFileMenu.setMenu(fileMenu);

    MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
    exitItem.setText("&Exit");

    MenuItem cascadeViewMenu = new MenuItem(menuBar, SWT.CASCADE);
    cascadeViewMenu.setText("&View");

    Menu viewMenu = new Menu(shell, SWT.DROP_DOWN);
    cascadeViewMenu.setMenu(viewMenu);

    statItem = new MenuItem(viewMenu, SWT.CHECK);
    statItem.setSelection(true);
    statItem.setText("&View Statusbar");

    statItem.addListener(SWT.Selection, new MyStatusListener());

    exitItem.addSelectionListener(new MySelectionAdapter());

    status = new Label(shell, SWT.BORDER);
    status.setText("Ready");
    FormLayout layout = new FormLayout();
    shell.setLayout(layout);

    FormData labelData = new FormData();
    labelData.left = new FormAttachment(0);
    labelData.right = new FormAttachment(100);
    labelData.bottom = new FormAttachment(100);
    status.setLayoutData(labelData);
    
    shell.setText("Check menu item");
    shell.setSize(300, 250);
    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }    
  }
  
  private class MyStatusListener implements Listener {

    @Override
    public void handleEvent(Event event) {
      
      if (statItem.getSelection()) {
        status.setVisible(true);
      } else {
        status.setVisible(false);
      }
    }
  }  
  
  private class MySelectionAdapter extends SelectionAdapter {
    
    @Override
    public void widgetSelected(SelectionEvent e) {
      shell.getDisplay().dispose();
      System.exit(0);
    }    
  }

  @SuppressWarnings("unused")
  public static void main(String[] args) {
    
    Display display = new Display();
    CheckMenuItemEx ex = new CheckMenuItemEx(display);
    display.dispose();
  }
}

In our code example we show a check menu item. If the check box is activated, the statusbar is shown. If not, the statusbar is hidden.

statItem = new MenuItem(viewMenu, SWT.CHECK);

The SWT.CHECK flag will create a check menu item.

statItem.setSelection(true);

The setSelection() method checks or unchecks the check menu item.

if (statItem.getSelection()) {
  status.setVisible(true);
} else {
  status.setVisible(false);
}

Depending on the state of the check menu item, we show or hide the label widget.

Check menu item
Figure: Check menu item

Popup menu

In the next example, we create a popup menu. Popup menu is also called a context menu. This type of menu is shown when we right click on an object.

PopupMenuEx.java

package com.zetcode;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;

/**
 * ZetCode Java SWT tutorial
 *
 * This program creates a popup menu.
 *
 * Author: Jan Bodnar
 * Website: zetcode.com
 * Last modified: June 2015
 */

public class PopupMenuEx {

  public PopupMenuEx(Display display) {

    initUI(display);
  }

  private void initUI(Display display) {
    
    Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);

    Menu menu = new Menu(shell, SWT.POP_UP);
    MenuItem minItem = new MenuItem(menu, SWT.PUSH);
    minItem.setText("Minimize");

    minItem.addListener(SWT.Selection, event -> {
      shell.setMinimized(true);
    });

    MenuItem exitItem = new MenuItem(menu, SWT.PUSH);
    exitItem.setText("Exit");

    exitItem.addListener(SWT.Selection, event -> {
      shell.getDisplay().dispose();
      System.exit(0);
    });

    shell.setText("Popup menu");
    shell.setMenu(menu);
    shell.setSize(300, 250);
    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }    
  }

  @SuppressWarnings("unused")
  public static void main(String[] args) {
    
    Display display = new Display();
    PopupMenuEx ex = new PopupMenuEx(display);
    display.dispose();
  }
}

In our code example, we create a popup menu with two menu items. The first minimizes the window, and the second terminates the application.

Menu menu = new Menu(shell, SWT.POP_UP);

Popup menu is created with the SWT.POP_UP flag.

MenuItem minItem = new MenuItem(menu, SWT.PUSH);
minItem.setText("Minimize");

Menu items inside a popup menu are normal push menu items.

minItem.addListener(SWT.Selection, event -> {
  shell.setMinimized(true);
});

The setMinimized() method minimizes the window.

shell.setMenu(menu);

We set a popup menu for the shell.

Popup menu
Figure: Popup menu

Simple toolbar

Menus group commands that we can use in application. Toolbars provide a quick access to the most frequently used commands. In the following example, we create a simple toolbar.

SimpleToolBarEx.java

package com.zetcode;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;

/**
 * ZetCode Java SWT tutorial
 *
 * This program creates a simple toolbar.
 *
 * Author: Jan Bodnar
 * Website: zetcode.com
 * Last modified: June 2015
 */

public class SimpleToolBarEx {

  private Image newi;
  private Image opei;
  private Image quii;

  public SimpleToolBarEx(Display display) {

    initUI(display);
  }

  @SuppressWarnings("unused")
  public void initUI(Display display) {
    
    Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);

    Device dev = shell.getDisplay();

    try {
      newi = new Image(dev, "new.png");
      opei = new Image(dev, "open.png");
      quii = new Image(dev, "quit.png");

    } catch (Exception e) {
      
      System.out.println("Cannot load images");
      System.out.println(e.getMessage());
      System.exit(1);
    }

    ToolBar toolBar = new ToolBar(shell, SWT.BORDER);

    ToolItem item1 = new ToolItem(toolBar, SWT.PUSH);
    item1.setImage(newi);

    ToolItem item2 = new ToolItem(toolBar, SWT.PUSH);
    item2.setImage(opei);

    ToolItem separator = new ToolItem(toolBar, SWT.SEPARATOR);

    ToolItem item3 = new ToolItem(toolBar, SWT.PUSH);
    item3.setImage(quii);

    toolBar.pack();

    item3.addListener(SWT.Selection, event -> {
      shell.getDisplay().dispose();
      System.exit(0);
    });
    
    shell.setText("Simple toolbar");
    shell.setSize(300, 250);
    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
  }
  
  @Override
  public void finalize() {

    newi.dispose();
    opei.dispose();
    quii.dispose();
  }

  public static void main(String[] args) {
    
    Display display = new Display();
    SimpleToolBarEx ex = new SimpleToolBarEx(display);
    ex.finalize();
    display.dispose();
  }
}

The example shows a toolbar and three tool items.

ToolBar toolBar = new ToolBar(shell, SWT.BORDER);

A toolbar is created.

ToolItem item1 = new ToolItem(toolBar, SWT.PUSH);
item1.setImage(newi);

We create a tool item with an image.

ToolItem separator = new ToolItem(toolBar, SWT.SEPARATOR);

Here we create a vertical separator.

Toolbar
Figure: Toolbar

In this chapter of the Java SWT tutorial, we showed how to work with menus & toolbars.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文