原文: http://zetcode.com/gui/javaswt/widgets/

在 Java SWT 编程教程的这一部分中,我们将介绍一些 SWT 小部件。

小部件是 GUI 应用的基本构建块。 将小部件视为乐高玩具的一部分。 多年来,几个小部件已成为所有 OS 平台上所有工具包中的标准。 例如,按钮,复选框或滚动条。

Label

Label是显示字符串或图像的不可选择的用户界面对象。 此外,它可以显示水平或垂直线。

LabelEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.graphics.Point;
  4. import org.eclipse.swt.widgets.Display;
  5. import org.eclipse.swt.widgets.Label;
  6. import org.eclipse.swt.widgets.Shell;
  7. /**
  8. * ZetCode Java SWT tutorial
  9. *
  10. * This program uses the Label widget to
  11. * show lyrics of a song.
  12. *
  13. * Author: Jan Bodnar
  14. * Website: zetcode.com
  15. * Last modified: June 2015
  16. */
  17. public class LabelEx {
  18. final String lyrics =
  19. "And I know that he knows I'm unfaithful\n"+
  20. "And it kills him inside\n"+
  21. "To know that I am happy with some other guy\n"+
  22. "I can see him dyin'\n"+
  23. "\n"+
  24. "I don't wanna do this anymore\n"+
  25. "I don't wanna be the reason why\n"+
  26. "Every time I walk out the door\n"+
  27. "I see him die a little more inside\n"+
  28. "I don't wanna hurt him anymore\n"+
  29. "I don't wanna take away his life\n"+
  30. "I don't wanna be... A murderer";
  31. public LabelEx(Display display) {
  32. initUI(display);
  33. }
  34. private void initUI(Display display) {
  35. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  36. Label label = new Label(shell, SWT.LEFT);
  37. label.setText(lyrics);
  38. Point p = label.computeSize(SWT.DEFAULT, SWT.DEFAULT);
  39. label.setBounds(5, 5, p.x+5, p.y+5);
  40. shell.setText("Unfaithful");
  41. shell.pack();
  42. shell.open();
  43. while (!shell.isDisposed()) {
  44. if (!display.readAndDispatch()) {
  45. display.sleep();
  46. }
  47. }
  48. }
  49. @SuppressWarnings("unused")
  50. public static void main(String[] args) {
  51. Display display = new Display();
  52. LabelEx ex = new LabelEx(display);
  53. display.dispose();
  54. }
  55. }

该代码示例在窗口上显示了一些歌词。

  1. String lyrics =
  2. "And I know that he knows I'm unfaithful\n"+
  3. "And it kills him inside\n"+
  4. ...

我们构建多行文本。

  1. Label label = new Label(shell, SWT.LEFT);
  2. label.setText(lyrics);

Label小部件已创建; SWT.LEFT选项使其文本保持左对齐。

  1. Point p = label.computeSize(SWT.DEFAULT, SWT.DEFAULT);
  2. label.setBounds(5, 5, p.x+5, p.y+5);

我们计算文本的大小,以便在文本周围放置一些空间。

  1. shell.pack();

pack()方法将窗口调整为首选大小。 足够大以显示标签小部件。

CheckBox

在 SWT 中,复选按钮是Button的特例。 它是具有两种状态的窗口小部件:打开和关闭。 接通状态通过复选标记显示。 它用来表示一些布尔属性。

CheckButtonEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.layout.RowLayout;
  4. import org.eclipse.swt.widgets.Button;
  5. import org.eclipse.swt.widgets.Display;
  6. import org.eclipse.swt.widgets.Shell;
  7. /**
  8. * ZetCode Java SWT tutorial
  9. *
  10. * This program uses a check button
  11. * widget to show/hide the title
  12. * of the window.
  13. *
  14. * Author: Jan Bodnar
  15. * Website: zetcode.com
  16. * Last modified: June 2015
  17. */
  18. public class CheckButtonEx {
  19. private Shell shell;
  20. public CheckButtonEx(Display display) {
  21. initUI(display);
  22. }
  23. private void initUI(Display display) {
  24. shell = new Shell(display);
  25. RowLayout layout = new RowLayout();
  26. layout.marginLeft = 30;
  27. layout.marginTop = 30;
  28. shell.setLayout(layout);
  29. Button cb = new Button(shell, SWT.CHECK);
  30. cb.setText("Show title");
  31. cb.setSelection(true);
  32. cb.addListener(SWT.Selection, event -> onButtonSelect(cb));
  33. shell.setText("Check button");
  34. shell.setSize(250, 200);
  35. shell.open();
  36. while (!shell.isDisposed()) {
  37. if (!display.readAndDispatch()) {
  38. display.sleep();
  39. }
  40. }
  41. }
  42. private void onButtonSelect(Button cb) {
  43. if (cb.getSelection()) {
  44. shell.setText("Check button");
  45. } else {
  46. shell.setText("");
  47. }
  48. }
  49. @SuppressWarnings("unused")
  50. public static void main(String[] args) {
  51. Display display = new Display();
  52. CheckButtonEx ex = new CheckButtonEx(display);
  53. display.dispose();
  54. }
  55. }

窗口标题的显示取决于检查按钮的状态。

  1. Button cb = new Button(shell, SWT.CHECK);
  2. cb.setText("Show title");

通过将SWT.CHECK传递给Button构造器来创建复选按钮小部件。 setText()方法设置按钮的标签。

  1. cb.setSelection(true);

默认情况下标题是可见的,因此我们默认使用setSelection()方法选择复选按钮。

  1. cb.addListener(SWT.Selection, event -> onButtonSelect(cb));

我们向按钮的SWT.Selection事件类型添加一个监听器对象。

  1. private void onButtonSelect(Button cb) {
  2. if (cb.getSelection()) {
  3. shell.setText("Check button");
  4. } else {
  5. shell.setText("");
  6. }
  7. }

onButtonSelect()方法内部,我们根据选中按钮的状态显示或隐藏窗口的标题。 确认按钮的状态通过getSelection()方法确定。

Java SWT 中的小部件 - 图1

图:复选按钮

Spinner

Spinner控件允许从一系列值中选择一个数字。 可以通过单击向上和向下箭头或通过按下和向上键向上键来选择该值。 向下翻页键。

SpinnerEx.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.Display;
  6. import org.eclipse.swt.widgets.Label;
  7. import org.eclipse.swt.widgets.Shell;
  8. import org.eclipse.swt.widgets.Spinner;
  9. public class SpinnerEx {
  10. private Label label;
  11. public SpinnerEx(Display display) {
  12. initUI(display);
  13. }
  14. private void initUI(Display display) {
  15. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  16. RowLayout layout = new RowLayout();
  17. layout.marginLeft = 10;
  18. layout.marginTop = 10;
  19. layout.spacing = 30;
  20. layout.center = true;
  21. shell.setLayout(layout);
  22. Spinner spinner = new Spinner(shell, SWT.BORDER);
  23. spinner.setMinimum(0);
  24. spinner.setMaximum(100);
  25. spinner.setSelection(0);
  26. spinner.setIncrement(1);
  27. spinner.setPageIncrement(10);
  28. spinner.setLayoutData(new RowData(30, -1));
  29. spinner.addListener(SWT.Selection, event -> onSelected(spinner));
  30. label = new Label(shell, SWT.NONE);
  31. label.setText("0");
  32. shell.setText("Spinner");
  33. shell.setSize(200, 150);
  34. shell.open();
  35. while (!shell.isDisposed()) {
  36. if (!display.readAndDispatch()) {
  37. display.sleep();
  38. }
  39. }
  40. }
  41. private void onSelected(Spinner spinner) {
  42. String val = spinner.getText();
  43. label.setText(val);
  44. label.pack();
  45. }
  46. @SuppressWarnings("unused")
  47. public static void main(String[] args) {
  48. Display display = new Display();
  49. SpinnerEx ex = new SpinnerEx(display);
  50. display.dispose();
  51. }
  52. }

该示例具有SpinnerLabel。 从微调器中选择的值显示在标签中。

  1. Spinner spinner = new Spinner(shell, SWT.BORDER);

创建Spinner控件的实例。

  1. spinner.setMinimum(0);
  2. spinner.setMaximum(100);
  3. spinner.setSelection(0);
  4. spinner.setIncrement(1);
  5. spinner.setPageIncrement(10);

我们使用微调器 API 指定最小,最大,当前,增量和页面增量值。

  1. spinner.addListener(SWT.Selection, event -> onSelected(spinner));

等待微调器选择事件的监听器已添加到控件中。 触发事件时,将调用onSelected()方法。

  1. private void onSelected(Spinner spinner) {
  2. String val = spinner.getText();
  3. label.setText(val);
  4. label.pack();
  5. }

我们获得微调器的当前值,并将其设置为标签组件。

Java SWT 中的小部件 - 图2

图:旋钮

List小部件

List小部件使用户可以从项目列表中选择一个选项。 列表可以是单选或多选。

ListWidgetEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.layout.FormAttachment;
  4. import org.eclipse.swt.layout.FormData;
  5. import org.eclipse.swt.layout.FormLayout;
  6. import org.eclipse.swt.widgets.Display;
  7. import org.eclipse.swt.widgets.Label;
  8. import org.eclipse.swt.widgets.List;
  9. import org.eclipse.swt.widgets.Shell;
  10. /**
  11. * ZetCode Java SWT tutorial
  12. *
  13. * This program shows the List widget.
  14. *
  15. * Author: Jan Bodnar
  16. * Website: zetcode.com
  17. * Last modified: June 2015
  18. */
  19. public class ListWidgetEx {
  20. private Label status;
  21. public ListWidgetEx(Display display) {
  22. initUI(display);
  23. }
  24. private void initUI(Display display) {
  25. Shell shell = new Shell(display);
  26. status = new Label(shell, SWT.NONE);
  27. status.setText("Ready");
  28. FormLayout layout = new FormLayout();
  29. layout.marginHeight = 5;
  30. layout.marginWidth = 5;
  31. layout.spacing = 5;
  32. shell.setLayout(layout);
  33. FormData labelData = new FormData();
  34. labelData.left = new FormAttachment(0);
  35. labelData.right = new FormAttachment(100);
  36. labelData.bottom = new FormAttachment(100);
  37. status.setLayoutData(labelData);
  38. List list = new List(shell, SWT.BORDER);
  39. list.add("Aliens");
  40. list.add("Capote");
  41. list.add("Neverending story");
  42. list.add("Starship troopers");
  43. list.add("Exorcist");
  44. list.add("Omen");
  45. list.addListener(SWT.Selection, event -> onListItemSelect(list));
  46. FormData listData = new FormData();
  47. listData.width = 250;
  48. listData.height = 200;
  49. listData.left = new FormAttachment(shell, 0);
  50. listData.top = new FormAttachment(shell, 0);
  51. listData.right = new FormAttachment(100, 0);
  52. listData.bottom = new FormAttachment(status, 0);
  53. list.setLayoutData(listData);
  54. shell.setText("List");
  55. shell.pack();
  56. shell.open();
  57. while (!shell.isDisposed()) {
  58. if (!display.readAndDispatch()) {
  59. display.sleep();
  60. }
  61. }
  62. }
  63. private void onListItemSelect(List list) {
  64. String[] items = list.getSelection();
  65. status.setText(items[0]);
  66. }
  67. @SuppressWarnings("unused")
  68. public static void main(String[] args) {
  69. Display display = new Display();
  70. ListWidgetEx ex = new ListWidgetEx(display);
  71. display.dispose();
  72. }
  73. }

在此示例中,从列表小部件中选择的项目显示在状态栏中。

  1. status = new Label(shell, SWT.NONE);
  2. status.setText("Ready");

标签小部件用于状态栏。 SWT 不将本机窗口小部件用于状态栏。

  1. FormLayout layout = new FormLayout();
  2. layout.marginHeight = 5;
  3. layout.marginWidth = 5;
  4. layout.spacing = 5;
  5. shell.setLayout(layout);

我们使用FormLayout小部件在窗口上排列小部件。 设置了一些边距和间距。

  1. FormData labelData = new FormData();
  2. labelData.left = new FormAttachment(0);
  3. labelData.right = new FormAttachment(100);
  4. labelData.bottom = new FormAttachment(100);
  5. status.setLayoutData(labelData);

此代码将状态标签粘贴在窗口底部; 状态栏的通常位置。

  1. List list = new List(shell, SWT.BORDER);

List小部件已创建。 默认选择模式是单选。

  1. list.add("Aliens");
  2. list.add("Capote");
  3. list.add("Neverending story");
  4. list.add("Starship troopers");
  5. list.add("Exorcist");
  6. list.add("Omen");

它充满了数据。

  1. list.addListener(SWT.Selection, event -> onListItemSelect(list));

我们将选择监听器添加到List小部件。 在列表选择事件中,将调用onListItemSelect()方法。

  1. FormData listData = new FormData();
  2. listData.width = 250;
  3. listData.height = 200;
  4. listData.left = new FormAttachment(shell, 0);
  5. listData.top = new FormAttachment(shell, 0);
  6. listData.right = new FormAttachment(100, 0);
  7. listData.bottom = new FormAttachment(status, 0);
  8. list.setLayoutData(listData);

此代码使List小部件占据了窗口区域的大部分。 widthheight属性指定列表的首选大小。

  1. private void onListItemSelect(List list) {
  2. String[] items = list.getSelection();
  3. status.setText(items[0]);
  4. }

onListItemSelect()内部,我们确定列表中的选定项目并将其设置为状态栏。

Java SWT 中的小部件 - 图3

图:List小部件

Slider

Slider是一个小部件,可让用户通过在有限间隔内滑动旋钮以图形方式选择一个值。 我们的示例将显示音量控制。

SliderEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.graphics.Device;
  4. import org.eclipse.swt.graphics.Image;
  5. import org.eclipse.swt.layout.RowData;
  6. import org.eclipse.swt.layout.RowLayout;
  7. import org.eclipse.swt.widgets.Display;
  8. import org.eclipse.swt.widgets.Label;
  9. import org.eclipse.swt.widgets.Shell;
  10. import org.eclipse.swt.widgets.Slider;
  11. /**
  12. * ZetCode Java SWT tutorial
  13. *
  14. * In this program, we use the slider
  15. * widget to create a volume control
  16. *
  17. * Author: Jan Bodnar
  18. * Website: zetcode.com
  19. * Last modified: June 2015
  20. */
  21. public class SliderEx {
  22. private Shell shell;
  23. private Label label;
  24. private Image mute;
  25. private Image min;
  26. private Image med;
  27. private Image max;
  28. public SliderEx(Display display) {
  29. initUI(display);
  30. }
  31. private void loadImages() {
  32. Device dev = shell.getDisplay();
  33. try {
  34. mute = new Image(dev, "mute.png");
  35. min = new Image(dev, "min.png");
  36. med = new Image(dev, "med.png");
  37. max = new Image(dev, "max.png");
  38. } catch(Exception e) {
  39. System.out.println("Cannot load images");
  40. System.out.println(e.getMessage());
  41. System.exit(1);
  42. }
  43. }
  44. private void initUI(Display display) {
  45. shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  46. loadImages();
  47. RowLayout layout = new RowLayout();
  48. layout.marginLeft = 30;
  49. layout.marginTop = 30;
  50. layout.spacing = 30;
  51. layout.fill = true;
  52. shell.setLayout(layout);
  53. Slider slider = new Slider(shell, SWT.HORIZONTAL);
  54. slider.setMaximum(100);
  55. slider.setLayoutData(new RowData(180, -1));
  56. label = new Label(shell, SWT.IMAGE_PNG);
  57. label.setImage(mute);
  58. slider.addListener(SWT.Selection, event -> onSelection(slider));
  59. shell.setText("Slider");
  60. shell.setSize(350, 200);
  61. shell.open();
  62. while (!shell.isDisposed()) {
  63. if (!display.readAndDispatch()) {
  64. display.sleep();
  65. }
  66. }
  67. }
  68. private void onSelection(Slider slider) {
  69. int value = slider.getSelection();
  70. if (value == 0) {
  71. label.setImage(mute);
  72. label.pack();
  73. } else if (value > 0 && value <= 30) {
  74. label.setImage(min);
  75. } else if (value > 30 && value < 80) {
  76. label.setImage(med);
  77. } else {
  78. label.setImage(max);
  79. }
  80. }
  81. @Override
  82. public void finalize() {
  83. mute.dispose();
  84. med.dispose();
  85. min.dispose();
  86. max.dispose();
  87. }
  88. public static void main(String[] args) {
  89. Display display = new Display();
  90. SliderEx ex = new SliderEx(display);
  91. ex.finalize();
  92. display.dispose();
  93. }
  94. }

在上面的示例中,我们有一个Slider和一个Label小部件。 通过拖动滑块的旋钮,我们可以更改标签中显示的Image

  1. try {
  2. mute = new Image(dev, "mute.png");
  3. min = new Image(dev, "min.png");
  4. med = new Image(dev, "med.png");
  5. max = new Image(dev, "max.png");
  6. } catch(Exception e) {
  7. System.out.println("Cannot load images");
  8. System.out.println(e.getMessage());
  9. System.exit(1);
  10. }

图像从磁盘加载。

  1. Slider slider = new Slider(shell, SWT.HORIZONTAL);
  2. slider.setMaximum(100);

Slider小部件已创建。 最大值为 100。

  1. label = new Label(shell, SWT.IMAGE_PNG);
  2. label.setImage(mute);

使用SWT.IMAGE_PNG参数,标签窗口小部件显示 PNG 图像。 setImage()方法将图像设置为标签。

  1. slider.addListener(SWT.Selection, event -> onSelection(slider));

监听器已添加到滑块小部件。

  1. int value = slider.getSelection();

onSelection()方法内部,我们使用getSelection()方法获得滑块控件的值。

  1. if (value == 0) {
  2. label.setImage(mute);
  3. label.pack();
  4. } else if (value > 0 && value <= 30) {
  5. label.setImage(min);
  6. } else if (value > 30 && value < 80) {
  7. label.setImage(med);
  8. } else {
  9. label.setImage(max);
  10. }

根据获得的值,我们在标签小部件中更改图片。

  1. @Override
  2. public void finalize() {
  3. mute.dispose();
  4. med.dispose();
  5. min.dispose();
  6. max.dispose();
  7. }

最后,资源被释放。

Java SWT 中的小部件 - 图4

图:Slider小部件

Combo小部件

Combo是一个小部件,允许用户从选项的下拉列表中进行选择。

ComboEx.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.Combo;
  6. import org.eclipse.swt.widgets.Display;
  7. import org.eclipse.swt.widgets.Label;
  8. import org.eclipse.swt.widgets.Shell;
  9. /**
  10. * ZetCode Java SWT tutorial
  11. *
  12. * In this program, we use the Combo
  13. * widget to select an option.
  14. * The selected option is shown in the
  15. * Label widget.
  16. *
  17. * Author: Jan Bodnar
  18. * Website: zetcode.com
  19. * Last modified: June 2015
  20. */
  21. public class ComboEx {
  22. private Label label;
  23. public ComboEx(Display display) {
  24. initUI(display);
  25. }
  26. private void initUI(Display display) {
  27. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  28. RowLayout layout = new RowLayout(SWT.VERTICAL);
  29. layout.marginLeft = 50;
  30. layout.marginTop = 30;
  31. layout.spacing = 30;
  32. shell.setLayout(layout);
  33. Combo combo = new Combo(shell, SWT.DROP_DOWN);
  34. combo.add("Ubuntu");
  35. combo.add("Fedora");
  36. combo.add("Arch");
  37. combo.add("Red Hat");
  38. combo.add("Mint");
  39. combo.setLayoutData(new RowData(150, -1));
  40. label = new Label(shell, SWT.LEFT);
  41. label.setText("...");
  42. combo.addListener(SWT.Selection, event -> onSelected(combo));
  43. shell.setText("Combo");
  44. shell.setSize(300, 250);
  45. shell.open();
  46. while (!shell.isDisposed()) {
  47. if (!display.readAndDispatch()) {
  48. display.sleep();
  49. }
  50. }
  51. }
  52. private void onSelected(Combo combo) {
  53. label.setText(combo.getText());
  54. label.pack();
  55. }
  56. @SuppressWarnings("unused")
  57. public static void main(String[] args) {
  58. Display display = new Display();
  59. ComboEx ex = new ComboEx(display);
  60. display.dispose();
  61. }
  62. }

该示例显示了一个组合和一个标签。 该组合具有六个选项的列表。 这些是 Linux 发行版的名称。 标签窗口小部件显示了从组合框中选择的选项。

  1. Combo combo = new Combo(shell, SWT.DROP_DOWN);

Combo小部件已创建。

  1. combo.add("Ubuntu");
  2. combo.add("Fedora");
  3. combo.add("Mandriva");
  4. combo.add("Red Hat");
  5. combo.add("Mint");

组合框小部件充满了数据。

  1. private void onSelected(Combo combo) {
  2. label.setText(combo.getText());
  3. label.pack();
  4. }

我们将所选文本设置为标签小部件。 pack()方法使标签适合组合中新字符串的大小。

Java SWT 中的小部件 - 图5

图:Combo小部件

在 Java SWT 教程的这一部分中,我们描述了 SWT 库的一些小部件。