Menus & toolbars in Java SWT

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.