原文: 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添加到项目库中。

Java SWT 简介 - 图1

图:将swt.jar添加到 NetBeans 项目

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

使窗口居中

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

CenterWindowEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.graphics.Point;
  3. import org.eclipse.swt.graphics.Rectangle;
  4. import org.eclipse.swt.widgets.Display;
  5. import org.eclipse.swt.widgets.Shell;
  6. /**
  7. * ZetCode Java SWT tutorial
  8. *
  9. * In this program, we show a window in
  10. * the center of the screen
  11. *
  12. * Author: Jan Bodnar
  13. * Website: zetcode.com
  14. * Last modified: May 2015
  15. */
  16. public class CenterWindowEx {
  17. public CenterWindowEx(Display display) {
  18. Shell shell = new Shell(display);
  19. shell.setText("Center");
  20. shell.setSize(250, 200);
  21. centerWindow(shell);
  22. shell.open();
  23. while (!shell.isDisposed()) {
  24. if (!display.readAndDispatch()) {
  25. display.sleep();
  26. }
  27. }
  28. }
  29. private void centerWindow(Shell shell) {
  30. Rectangle bds = shell.getDisplay().getBounds();
  31. Point p = shell.getSize();
  32. int nLeft = (bds.width - p.x) / 2;
  33. int nTop = (bds.height - p.y) / 2;
  34. shell.setBounds(nLeft, nTop, p.x, p.y);
  35. }
  36. @SuppressWarnings("unused")
  37. public static void main(String[] args) {
  38. Display display = new Display();
  39. CenterWindowEx ex = new CenterWindowEx(display);
  40. display.dispose();
  41. }
  42. }

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

  1. Shell shell = new Shell(display);

创建一个顶层窗口。

  1. shell.setText("Center");

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

  1. shell.setSize(250, 200);

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

  1. shell.open();

窗口显示在屏幕上。

  1. while (!shell.isDisposed()) {
  2. if (!display.readAndDispatch()) {
  3. display.sleep();
  4. }
  5. }

这些行启动事件主循环。

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

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

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

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

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

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

  1. Display display = new Display();

创建了Display

  1. CenterWindowEx ex = new CenterWindowEx(display);

我们实例化示例程序。

  1. display.dispose();

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

创建工具提示

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

TooltipEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.widgets.Display;
  4. import org.eclipse.swt.widgets.Shell;
  5. /**
  6. * ZetCode Java SWT tutorial
  7. *
  8. * In this program, we show a tooltip.
  9. *
  10. * Author: Jan Bodnar
  11. * Website: zetcode.com
  12. * Last modified: May 2015
  13. */
  14. public class TooltipEx {
  15. public TooltipEx(Display display) {
  16. initUI(display);
  17. }
  18. private void initUI(Display display) {
  19. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  20. shell.setText("Tooltip");
  21. shell.setToolTipText("This is a window");
  22. shell.setSize(250, 200);
  23. shell.open();
  24. while (!shell.isDisposed()) {
  25. if (!display.readAndDispatch()) {
  26. display.sleep();
  27. }
  28. }
  29. }
  30. @SuppressWarnings("unused")
  31. public static void main(String[] args) {
  32. Display display = new Display();
  33. TooltipEx ex = new TooltipEx(display);
  34. display.dispose();
  35. }
  36. }

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

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

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

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

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

Java SWT 简介 - 图2

图:工具提示

退出按钮

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

QuitButtonEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.events.SelectionAdapter;
  4. import org.eclipse.swt.events.SelectionEvent;
  5. import org.eclipse.swt.layout.RowData;
  6. import org.eclipse.swt.layout.RowLayout;
  7. import org.eclipse.swt.widgets.Button;
  8. import org.eclipse.swt.widgets.Display;
  9. import org.eclipse.swt.widgets.Shell;
  10. /**
  11. * ZetCode Java SWT tutorial
  12. *
  13. * This example shows a button on a window.
  14. * Clicking on the button, we terminate
  15. * the application.
  16. *
  17. * Author: Jan Bodnar
  18. * Website: zetcode.com
  19. * Last modified: May 2015
  20. */
  21. public class QuitButtonEx {
  22. public QuitButtonEx(Display display) {
  23. initUI(display);
  24. }
  25. private void initUI(Display display) {
  26. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  27. RowLayout layout = new RowLayout();
  28. layout.marginLeft = 50;
  29. layout.marginTop = 50;
  30. shell.setLayout(layout);
  31. Button quitBtn = new Button(shell, SWT.PUSH);
  32. quitBtn.setText("Quit");
  33. quitBtn.setLayoutData(new RowData(80, 30));
  34. quitBtn.addSelectionListener(new SelectionAdapter() {
  35. @Override
  36. public void widgetSelected(SelectionEvent e) {
  37. shell.getDisplay().dispose();
  38. System.exit(0);
  39. }
  40. });
  41. shell.setText("Quit button");
  42. shell.setSize(250, 200);
  43. shell.open();
  44. while (!shell.isDisposed()) {
  45. if (!display.readAndDispatch()) {
  46. display.sleep();
  47. }
  48. }
  49. }
  50. @SuppressWarnings("unused")
  51. public static void main(String[] args) {
  52. Display display = new Display();
  53. QuitButtonEx ex = new QuitButtonEx(display);
  54. display.dispose();
  55. }
  56. }

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

  1. RowLayout layout = new RowLayout();
  2. layout.marginLeft = 50;
  3. layout.marginTop = 50;
  4. shell.setLayout(layout);

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

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

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

  1. quitBtn.setText("Quit");

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

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

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

  1. quitBtn.addSelectionListener(new SelectionAdapter() {
  2. @Override
  3. public void widgetSelected(SelectionEvent e) {
  4. shell.getDisplay().dispose();
  5. System.exit(0);
  6. }
  7. });

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

Java SWT 简介 - 图3

图:退出按钮

助记符

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

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

MnemonicEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.layout.RowData;
  4. import org.eclipse.swt.layout.RowLayout;
  5. import org.eclipse.swt.widgets.Button;
  6. import org.eclipse.swt.widgets.Display;
  7. import org.eclipse.swt.widgets.Shell;
  8. /**
  9. * ZetCode SWT tutorial
  10. *
  11. * This program creates a mnemonic for
  12. * a button widget.
  13. *
  14. * Author: Jan Bodnar
  15. * Website: zetcode.com
  16. * Last modified: June 2015
  17. */
  18. public class MnemonicEx {
  19. public MnemonicEx(Display display) {
  20. initUI(display);
  21. }
  22. private void initUI(Display display) {
  23. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  24. RowLayout layout = new RowLayout();
  25. layout.marginLeft = 30;
  26. layout.marginTop = 30;
  27. layout.marginBottom = 150;
  28. layout.marginRight = 150;
  29. shell.setLayout(layout);
  30. Button btn = new Button(shell, SWT.PUSH);
  31. btn.setText("&Button");
  32. btn.setLayoutData(new RowData(80, 30));
  33. btn.addListener(SWT.Selection, event -> System.out.println("Button clicked"));
  34. shell.setText("Mnemonic");
  35. shell.pack();
  36. shell.open();
  37. while (!shell.isDisposed()) {
  38. if (!display.readAndDispatch())
  39. display.sleep();
  40. }
  41. }
  42. @SuppressWarnings("unused")
  43. public static void main(String[] args) {
  44. Display display = new Display();
  45. MnemonicEx ex = new MnemonicEx(display);
  46. display.dispose();
  47. }
  48. }

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

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

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

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

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

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

本章是 Java SWT 库的简介。