# Java SWT 简介

> 原文： [http://zetcode.com/gui/javaswt/introduction/](http://zetcode.com/gui/javaswt/introduction/)

在 Java SWT 编程教程的这一部分中，我们介绍 Java SWT 库并创建我们的第一个程序。

本教程的目的是帮助您开始使用 Java SWT 工具包。 可以在此处下载本教程中使用的图像。 我使用了 Gnome 项目的探戈图标包中的一些图标。

## 关于

标准窗口小部件工具箱（SWT）是用于 Java 编程语言的图形窗口小部件工具箱。 它最初是由 IBM 开发的。 它是 Swing 和 JavaFX 的替代方法。 SWT 使用 Winapi 和 GTK+ 等本机 GUI API 通过 Java 本机接口（JNI）创建其小部件。

## 构建 SWT 应用

在 NetBeans 下，我们从官方网站下载了 SWT 包，并将`swt.jar`添加到项目库中。

![Adding swt.jar to the NetBeans project](img/1ef61cc8830889bcc6336e2f41936f40.jpg)

图：将`swt.jar`添加到 NetBeans 项目

对于 Eclipse，我们右键单击项目，然后选择“构建路径”，“配置构建路径”。 我们单击“添加外部 JAR ...”按钮，然后选择平台特定的 JAR 文件。

## 使窗口居中

在第一个示例中，我们创建一个简单的窗口。 窗口在屏幕上居中。

`CenterWindowEx.java`

```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();
    }
}

```

本示例在屏幕中央显示一个`250x200`像素的窗口。 在每个 SWT 应用中，都有两个重要的类：`Display`和`Shell`。 `Display`是 SWT 与基础 OS 之间的连接。 它实现了事件循环并提供了有关操作系统的信息。 `Shell`代表一个窗口。 有顶级的外壳； 这些将`Display`作为父项。 其他外壳称为辅助外壳。

```java
Shell shell = new Shell(display);

```

创建一个顶层窗口。

```java
shell.setText("Center");

```

我们使用`setText()`方法为窗口设置标题。

```java
shell.setSize(250, 200);

```

在这里，我们为外壳设置大小。

```java
shell.open();

```

窗口显示在屏幕上。

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

```

这些行启动事件主循环。

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

```

我们得到屏幕的分辨率。 如果使用多个显示器，则可能需要调用`getMonitor()`方法而不是`getDisplay()`。

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

```

我们计算窗口的左坐标和顶坐标。

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

```

我们使用`setBounds()`方法设置壳的边界。

```java
Display display = new Display();

```

创建了`Display`。

```java
CenterWindowEx ex = new CenterWindowEx(display);

```

我们实例化示例程序。

```java
display.dispose();

```

应用终止后，我们释放操作系统资源。

## 创建工具提示

第二个示例显示了一个工具提示。 工具提示是一个小的矩形窗口，它提供有关对象的简短信息。 它通常是一个 GUI 组件。 它是应用帮助系统的一部分。

`TooltipEx.java`

```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();
    }
}

```

该示例创建一个窗口。 如果将鼠标指针悬停在窗口区域上方，则会弹出一个工具提示。

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

```

`style`参数指定外壳的行为。 传递`SWT.CENTER`选项可使外壳位于窗口的中心。 `SWT.SHELL_TRIM`在窗口上装饰。 它启用标题和标题栏按钮，并使窗口可调整大小。 这是外壳的默认样式。

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

```

此行为窗口创建工具提示。

![Tooltip](img/113635c35f47ef99b098707185840b7e.jpg)

图：工具提示

## 退出按钮

在本节的最后一个示例中，我们将创建一个退出按钮。 当我们按下此按钮时，应用终止。

`QuitButtonEx.java`

```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();
    }
}

```

该示例中有一个`Button`小部件； 单击该按钮可终止该应用。

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

```

`RowLayout`用于将按钮定位在窗口上。 该布局类将小部件放入简单的行或列中。

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

```

`Button`小部件已创建。 它的父级是外壳。 `SWT.PUSH`指定按钮的类型。

```java
quitBtn.setText("Quit");

```

我们使用`setText()`方法为按钮设置标签。

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

```

`setLayoutData()`方法指定退出按钮的布局数据。 在这种情况下，这些是按钮的大小。

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

```

我们为按钮添加一个选择监听器。 当我们单击按钮时，将调用`widgetSelected()`方法。 在此方法内部，我们释放 OS 资源并退出应用。

![Quit button](img/c4d1dc44e82b0dec8964ff7a4408fc15.jpg)

图：退出按钮

## 助记符

助记符是用于激活支持助记符的窗口小部件的快捷键。 例如，它们可以与标签，按钮或菜单项一起使用。

助记符是通过在小部件的标签上添加&字符来创建的。 它使下一个字符成为助记符。 字符与无鼠标修饰符（通常为 `Alt` ）结合在一起。 选择的字符带有下划线，但是可以以平台特定的方式强调。 在某些平台上，仅在按下无鼠标修饰符后才对字符加下划线。

`MnemonicEx.java`

```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();
    }
}

```

我们为按钮小部件设置了助记符。 可以使用 `Alt + B` 键盘快捷键激活。

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

```

通过在按钮的标签上添加&字符来创建助记符。 `Alt + B` 快捷键现在激活该按钮。

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

```

激活后，该按钮会将消息打印到控制台。 lambda 表达式用于向按钮添加监听器。

目前，有三种激活按钮的方式：单击鼠标左键， `Alt + B` 快捷方式以及`空格键` 按钮具有焦点）。

本章是 Java SWT 库的简介。