Introduction to Java SWT

In this part of the Java SWT programming tutorial, we introduce the Java SWT library and create our first programs.

The purpose of this tutorial is to get you started with the Java SWT toolkit. Images used in this tutorial can be downloaded here. I used some icons from the tango icons pack of the Gnome project.

About

The Standard Widget Toolkit (SWT) is a graphical widget toolkit for the Java programming language. It was originally developed by IBM. It is an alternative to Swing and JavaFX. SWT uses native GUI APIs like Winapi and GTK+ to create its widgets via the Java Native interface (JNI).

Building SWT applications

Under NetBeans, we download the SWT package from the official website and add the swt.jar to the project libraries.

Adding swt.jar to the NetBeans project
Figure: Adding swt.jar to the NetBeans project

For Eclipse, we right click on the project and select Built Path, Configure Build Path. We click on the Add External JARs... button and select the platform specific JAR file.

Centering a window

In the first example, we create a simple window. The window is centered on the screen.

CenterWindowEx.java
package com.zetcode;

import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * ZetCode Java SWT tutorial
 *
 * In this program, we show a window in
 * the center of the screen
 *
 * Author: Jan Bodnar
 * Website: zetcode.com
 * Last modified: May 2015
 */

public class CenterWindowEx {

    public CenterWindowEx(Display display) {
       
        Shell shell = new Shell(display);
        shell.setText("Center");
        shell.setSize(250, 200);

        centerWindow(shell);

        shell.open();

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

    private void centerWindow(Shell shell) {

        Rectangle bds = shell.getDisplay().getBounds();

        Point p = shell.getSize();

        int nLeft = (bds.width - p.x) / 2;
        int nTop = (bds.height - p.y) / 2;

        shell.setBounds(nLeft, nTop, p.x, p.y);
    }

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

This example shows a 250x200 px window in the center of the screen. In each SWT application there are two important classes: Display and Shell. Display is the connection between SWT and the underlying OS. It implements the event loop and provides information about the OS. Shell represents a window. There are top-level shells; these take a Display as a parent. Other shells are called secondary shells.

Shell shell = new Shell(display);

A top-level window is created.

shell.setText("Center");

We set a title for the window with the setText() method.

shell.setSize(250, 200);

Here we set a size for the shell.

shell.open();

The window is shown on the screen.

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

These lines start the event mainloop.

Rectangle bds = shell.getDisplay().getBounds();

We get the resolution of the screen. If you work with more than one display, you might need to call the getMonitor() method instead of getDisplay().

int nLeft = (bds.width - p.x) / 2;
int nTop = (bds.height - p.y) / 2;

We calculate the left and top coordinates of the window.

shell.setBounds(nLeft, nTop, p.x, p.y);

We set the shell's bounds with the setBounds() method.

Display display = new Display();

A Display is created.

CenterWindowEx ex = new CenterWindowEx(display);

We instantiate our example program.

display.dispose();

After the application terminates, we release the OS resources.

Creating a tooltip

The second example shows a tooltip. A tooltip is a small rectangular window, which gives a brief information about an object. It is usually a GUI component; it is part of the help system of the application.

TooltipEx.java
package com.zetcode;

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

/**
 * ZetCode Java SWT tutorial
 *
 * In this program, we show a tooltip.
 * 
 * Author: Jan Bodnar
 * Website: zetcode.com
 * Last modified: May 2015
 */

public class TooltipEx {

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

        shell.setText("Tooltip");
        shell.setToolTipText("This is a window");
        shell.setSize(250, 200);

        shell.open();

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

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

The example creates a window. If we hover a mouse pointer over the area of the window, a tooltip pops up.

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

The style parameter specifies the behaviour of the shell. Passing the SWT.CENTER option makes the shell centered on the window. The SWT.SHELL_TRIM puts a decoration on the window. It enables the title and the titlebar buttons, and makes the window resizable. It is the shell's default style.

shell.setToolTipText("This is a window");

This line creates a tooltip for the window.

Tooltip
Figure: Tooltip

Quit button

In the last example of this section, we will create a quit button. When we press this button, the application terminates.

QuitButtonEx.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.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * ZetCode Java SWT tutorial
 *
 * This example shows a button on a window. 
 * Clicking on the button, we terminate
 * the application.
 *
 * Author: Jan Bodnar 
 * Website: zetcode.com 
 * Last modified: May 2015
 */

public class QuitButtonEx {

    public QuitButtonEx(Display display) {

        initUI(display);
    }

    private void initUI(Display display) {

        Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
        
        RowLayout layout = new RowLayout();
        layout.marginLeft = 50;
        layout.marginTop = 50;
        shell.setLayout(layout);

        Button quitBtn = new Button(shell, SWT.PUSH);
        quitBtn.setText("Quit");
        quitBtn.setLayoutData(new RowData(80, 30));

        quitBtn.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                shell.getDisplay().dispose();
                System.exit(0);
            }
        });

        shell.setText("Quit button");
        shell.setSize(250, 200);
        shell.open();

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

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

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

There is a Button widget in the example; clicking on the button terminates the application.

RowLayout layout = new RowLayout();
layout.marginLeft = 50;
layout.marginTop = 50;
shell.setLayout(layout);

RowLayout is used to position the button on the window. This layout class puts widgets into simple rows or columns.

Button quitBtn = new Button(shell, SWT.PUSH);

A Button widget is created. Its parent is the shell. The SWT.PUSH specifies the type of the button.

quitBtn.setText("Quit");

We set a label for the button with the setText() method.

quitBtn.setLayoutData(new RowData(80, 30));

The setLayoutData() method specifies the layout data for the quit button. In this case, these are the button's dimensions.

quitBtn.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent e) {
        shell.getDisplay().dispose();
        System.exit(0);
    }
});

We add a selection listener for the button. When we click on the button, the widgetSelected() method is called. Inside this method, we release the OS resources and exit the application.

Quit button
Figure: Quit button

Mnemonics

Mnemonics are shortcut keys that activate a widget that supports mnemonics. For instance, they can be used with labels, buttons, or menu items.

The mnemonic is created by adding the & character to the widget's label. It causes the next character to be the mnemonic. The character is combined with the mouseless modifier, usually Alt. The chosen character is underlined, but it may be emphasized in a platform specific manner. On some platforms, the character is only underlined after pressing the mouseless modifier.

MnemonicEx.java
package com.zetcode;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * ZetCode SWT tutorial
 *
 * This program creates a mnemonic for 
 * a button widget.
 *
 * Author: Jan Bodnar
 * Website: zetcode.com
 * Last modified: June 2015
 */

public class MnemonicEx {

    public MnemonicEx(Display display) {

        initUI(display);
    }
    
    private void initUI(Display display) {
        
        Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
        RowLayout layout = new RowLayout();
        layout.marginLeft = 30;
        layout.marginTop = 30;
        layout.marginBottom = 150;
        layout.marginRight = 150;
        
        shell.setLayout(layout);
        
        Button btn = new Button(shell, SWT.PUSH);
        btn.setText("&Button");
        btn.setLayoutData(new RowData(80, 30));
        btn.addListener(SWT.Selection, event -> System.out.println("Button clicked"));

        shell.setText("Mnemonic");
        shell.pack();
        shell.open();
        
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }        
    }
    
    @SuppressWarnings("unused")
    public static void main(String[] args) {

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

We set a mnemonic for a button widget. It can be activated with the Alt+B keyboard shortcut.

Button btn = new Button(shell, SWT.PUSH);
btn.setText("&Button");

The mnemonic is created by adding the & character to the button's label. The Alt+B shortcut now activates the button.

btn.addListener(SWT.Selection, event -> System.out.println("Button clicked"));

When activated, the button prints a message to the console. The lambda expression is used to add a listener to the button.

At this moment, there are three ways to activate the button: a left mouse button click, the Alt+B shortcut, and the Space key (provided the button has the focus).

This chapter was an introduction to the Java SWT library.