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

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

小部件是 GUI 应用的基本构建块。 多年来,几个小部件已成为所有 OS 平台上所有工具包中的标准。 例如,按钮,复选框或滚动条。 GTK+ 工具箱的理念是将小部件的数量保持在最低水平。 将创建更多专门的小部件作为自定义小部件。

Label

Label小部件显示文本。

label.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Gtk;
  4. import org.gnome.gtk.Label;
  5. import org.gnome.gtk.Widget;
  6. import org.gnome.gtk.Window;
  7. import org.gnome.gtk.WindowPosition;
  8. /**
  9. * ZetCode Java Gnome tutorial
  10. *
  11. * This program uses Label widget
  12. * to display text.
  13. *
  14. * @author jan bodnar
  15. * website zetcode.com
  16. * last modified March 2009
  17. */
  18. public class GLabel extends Window {
  19. public GLabel() {
  20. setTitle("Death song");
  21. initUI();
  22. connect(new Window.DeleteEvent() {
  23. public boolean onDeleteEvent(Widget source, Event event) {
  24. Gtk.mainQuit();
  25. return false;
  26. }
  27. });
  28. setPosition(WindowPosition.CENTER);
  29. showAll();
  30. }
  31. public void initUI() {
  32. Label lyrics = new Label("Lets sing the death song kids\n\n" +
  33. "We light a candle on an earth\n" +
  34. "We made into hell\n" +
  35. "And pretend that were in heaven\n" +
  36. "Each time we do we get\n" +
  37. "The blind mans ticket\n" +
  38. "And we know that nothings true\n" +
  39. "I saw priest kill a cop on the tv\n" +
  40. "And I know now theyre our heroes too\n\n" +
  41. "We sing the death song kids\n" +
  42. "Because weve got no future\n" +
  43. "And we want to be just like you\n" +
  44. "And we want to be just like you\n");
  45. add(lyrics);
  46. setBorderWidth(8);
  47. }
  48. public static void main(String[] args) {
  49. Gtk.init(args);
  50. new GLabel();
  51. Gtk.main();
  52. }
  53. }

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

  1. Label lyrics = new Label("Lets sing the death song kids\n\n" +
  2. "We light a candle on an earth\n" +
  3. ...

这是我们将在Label小部件中显示的文本。

  1. setBorderWidth(8);

Label周围有一些空白。

Java Gnome 中的小部件 - 图1

图:Label小部件

HSeparator

HSeparator是一个装饰小部件,可用于分隔窗口上的项目。

separator.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Gtk;
  4. import org.gnome.gtk.HSeparator;
  5. import org.gnome.gtk.Label;
  6. import org.gnome.gtk.VBox;
  7. import org.gnome.gtk.Widget;
  8. import org.gnome.gtk.Window;
  9. import org.gnome.gtk.WindowPosition;
  10. /**
  11. * Java Gnome tutorial
  12. *
  13. * This program shows how to use
  14. * a horizontal separator.
  15. *
  16. * @author jan bodnar
  17. * website zetcode.com
  18. * last modified March 2009
  19. */
  20. public class GHSeparator extends Window {
  21. private final int VERTICAL_SPACE = 15;
  22. private final int BORDER_AROUND = 25;
  23. private final float Y_ALIGN = 0f;
  24. private final float X_ALIGN = 0f;
  25. public GHSeparator() {
  26. setTitle("HSeparator");
  27. initUI();
  28. connect(new Window.DeleteEvent() {
  29. public boolean onDeleteEvent(Widget source, Event event) {
  30. Gtk.mainQuit();
  31. return false;
  32. }
  33. });
  34. setPosition(WindowPosition.CENTER);
  35. showAll();
  36. }
  37. public void initUI() {
  38. VBox vbox = new VBox(false, VERTICAL_SPACE);
  39. Label zinc = new Label("Zinc is a moderately reactive, blue" +
  40. "gray metal that tarnishes in moist air and burns in air of zinc " +
  41. "oxide. It reacts with acids, alkalis and other non-metals. If not" +
  42. "completely pure, zinc reacts with dilute acids to release hydrogen.");
  43. zinc.setLineWrap(true);
  44. zinc.setAlignment(X_ALIGN, Y_ALIGN);
  45. vbox.packStart(zinc);
  46. HSeparator hsep = new HSeparator();
  47. vbox.packStart(hsep);
  48. Label copper = new Label("Copper is an essential trace nutrient to" +
  49. "all high plants and animals. In animals, including humans," +
  50. "it is found primarily in the bloodstream, as a co-factor in various" +
  51. "enzymes, and in copper-based pigments. However, in sufficient" +
  52. "amounts, copper can be poisonous and even fatal to organisms.");
  53. copper.setAlignment(X_ALIGN, Y_ALIGN);
  54. copper.setLineWrap(true);
  55. vbox.packStart(copper);
  56. add(vbox);
  57. setResizable(false);
  58. setBorderWidth(BORDER_AROUND);
  59. }
  60. public static void main(String[] args) {
  61. Gtk.init(args);
  62. new GHSeparator();
  63. Gtk.main();
  64. }
  65. }

在我们的代码示例中,我们描述了两个化学元素,它们由水平分隔符分隔。

  1. zinc.setLineWrap(true);

该行换行。 对于较长的文本,这是必需的。

  1. zinc.setAlignment(X_ALIGN, Y_ALIGN);

此代码行使文本左对齐。

  1. HSeparator hsep = new HSeparator();
  2. vbox.packStart(hsep);

HSeparator小部件已创建并放置在两个标签小部件之间。

Java Gnome 中的小部件 - 图2

图:HSeparator

CheckButton

CheckButton是具有两种状态的窗口小部件:打开和关闭。 接通状态通过复选标记显示。 它用来表示一些布尔属性。

checkbutton.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.CheckButton;
  4. import org.gnome.gtk.Fixed;
  5. import org.gnome.gtk.Gtk;
  6. import org.gnome.gtk.ToggleButton;
  7. import org.gnome.gtk.Widget;
  8. import org.gnome.gtk.Window;
  9. import org.gnome.gtk.WindowPosition;
  10. /**
  11. * ZetCode Java Gnome tutorial
  12. *
  13. * This program uses a CheckButton to
  14. * toggle the visibility of a window title.
  15. *
  16. * @author jan bodnar
  17. * website zetcode.com
  18. * last modified March 2009
  19. */
  20. public class GCheckButton extends Window implements ToggleButton.Toggled {
  21. CheckButton check;
  22. Window window;
  23. private String title = "Check Button";
  24. public GCheckButton() {
  25. setTitle(title);
  26. initUI();
  27. connect(new Window.DeleteEvent() {
  28. public boolean onDeleteEvent(Widget source, Event event) {
  29. Gtk.mainQuit();
  30. return false;
  31. }
  32. });
  33. setSizeRequest(250, 200);
  34. showAll();
  35. }
  36. public void initUI() {
  37. setBorderWidth(10);
  38. Fixed fixed = new Fixed();
  39. check = new CheckButton("Show title");
  40. check.setActive(true);
  41. check.connect(this);
  42. check.setCanFocus(false);
  43. fixed.put(check, 50, 50);
  44. add(fixed);
  45. setPosition(WindowPosition.CENTER);
  46. }
  47. public void onToggled(ToggleButton toggleButton) {
  48. if (check.getActive()) {
  49. setTitle(title);
  50. } else {
  51. setTitle("");
  52. }
  53. }
  54. public static void main(String[] args) {
  55. Gtk.init(args);
  56. new GCheckButton();
  57. Gtk.main();
  58. }
  59. }

根据CheckButton的状态,我们将在窗口的标题栏中显示标题。

  1. check = new CheckButton("Show title");

CheckButton小部件已创建。

  1. check.setActive(true);

默认情况下标题是可见的,因此我们默认情况下选中复选按钮。

  1. if (check.getActive()) {
  2. setTitle(title);
  3. } else {
  4. setTitle("");
  5. }

根据CheckButton的状态,我们显示或隐藏窗口的标题。

Java Gnome 中的小部件 - 图3

图:CheckButton

TextComboBox

TextComboBox是一个小部件,允许用户从文本选项列表中进行选择。

textcombobox.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.ComboBox;
  4. import org.gnome.gtk.Fixed;
  5. import org.gnome.gtk.Gtk;
  6. import org.gnome.gtk.Label;
  7. import org.gnome.gtk.TextComboBox;
  8. import org.gnome.gtk.Widget;
  9. import org.gnome.gtk.Window;
  10. import org.gnome.gtk.WindowPosition;
  11. /**
  12. * ZetCode Java Gnome tutorial
  13. *
  14. * This program shows how to use
  15. * a TextComboBox.
  16. *
  17. * @author jan bodnar
  18. * website zetcode.com
  19. * last modified March 2009
  20. */
  21. public class GTextComboBox extends Window implements ComboBox.Changed {
  22. TextComboBox cb;
  23. Label label;
  24. public GTextComboBox() {
  25. setTitle("TextComboBox");
  26. initUI();
  27. setSizeRequest(250, 200);
  28. setPosition(WindowPosition.CENTER);
  29. showAll();
  30. }
  31. public void initUI() {
  32. connect(new Window.DeleteEvent() {
  33. public boolean onDeleteEvent(Widget source, Event event) {
  34. Gtk.mainQuit();
  35. return false;
  36. }
  37. });
  38. Fixed fixed = new Fixed();
  39. label = new Label("");
  40. fixed.put(label, 55, 130);
  41. cb = new TextComboBox();
  42. cb.appendText("Ubuntu");
  43. cb.appendText("Mandriva");
  44. cb.appendText("Fedora");
  45. cb.appendText("Mint");
  46. cb.appendText("Debian");
  47. cb.appendText("Gentoo");
  48. cb.connect(this);
  49. fixed.put(cb, 50, 50);
  50. add(fixed);
  51. }
  52. public void onChanged(ComboBox comboBox) {
  53. String text = cb.getActiveText();
  54. label.setLabel(text);
  55. }
  56. public static void main(String[] args) {
  57. Gtk.init(args);
  58. new GTextComboBox();
  59. Gtk.main();
  60. }
  61. }

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

  1. cb = new TextComboBox();

TextComboBox小部件已创建。

  1. cb.appendText("Ubuntu");

调用appendText()方法来填充文本组合框。

  1. public void onChanged(ComboBox comboBox) {
  2. String text = cb.getActiveText();
  3. label.setLabel(text);
  4. }

当我们从文本组合框中选择一个选项时,将调用onChanged()方法。 我们获取选定的文本并将其设置为标签小部件。

Java Gnome 中的小部件 - 图4

图:TextComboBox

Image

下一个示例介绍Image小部件。 此小部件显示图片。

image.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Gtk;
  4. import org.gnome.gtk.Image;
  5. import org.gnome.gtk.Widget;
  6. import org.gnome.gtk.Window;
  7. import org.gnome.gtk.WindowPosition;
  8. /**
  9. * ZetCode Java Gnome tutorial
  10. *
  11. * This program shows an image of a castle
  12. * in the window.
  13. *
  14. * @author jan bodnar
  15. * website zetcode.com
  16. * last modified March 2009
  17. */
  18. public class GImage extends Window {
  19. public GImage() {
  20. setTitle("Red Rock");
  21. initUI();
  22. setPosition(WindowPosition.CENTER);
  23. showAll();
  24. }
  25. public void initUI() {
  26. connect(new Window.DeleteEvent() {
  27. public boolean onDeleteEvent(Widget source, Event event) {
  28. Gtk.mainQuit();
  29. return false;
  30. }
  31. });
  32. Image image = new Image("redrock.png");
  33. int width = image.getRequisition().getWidth();
  34. int height = image.getRequisition().getHeight();
  35. setSizeRequest(width, height);
  36. add(image);
  37. setBorderWidth(2);
  38. }
  39. public static void main(String[] args) {
  40. Gtk.init(args);
  41. new GImage();
  42. Gtk.main();
  43. }
  44. }

我们在窗口中显示红色岩石城堡。

  1. Image image = new Image("redrock.png");

我们创建Image小部件的实例。 请注意,我们不会捕获任何异常。 图像小部件已经可以处理它们。 如果“图像”小部件找不到redrock.png图像,则默认情况下将显示丢失的图像。

  1. Image image = new Image(castle);
  2. Add(image);

Image小部件已创建并添加到窗口。

Java Gnome 中的小部件 - 图5

图:图像

在本章中,我们展示了 Java Gnome 编程库的第一组基本小部件。