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

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

Entry

Entry是单行文本输入字段。 该小部件用于输入文本数据。

entry.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Editable;
  4. import org.gnome.gtk.Entry;
  5. import org.gnome.gtk.Fixed;
  6. import org.gnome.gtk.Gtk;
  7. import org.gnome.gtk.Label;
  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. * an Entry widget.
  16. *
  17. * @author jan bodnar
  18. * website zetcode.com
  19. * last modified March 2009
  20. */
  21. public class GEntry extends Window {
  22. private Label label;
  23. private Entry entry;
  24. public GEntry() {
  25. setTitle("Entry");
  26. initUI();
  27. connect(new Window.DeleteEvent() {
  28. public boolean onDeleteEvent(Widget source, Event event) {
  29. Gtk.mainQuit();
  30. return false;
  31. }
  32. });
  33. setDefaultSize(250, 200);
  34. setPosition(WindowPosition.CENTER);
  35. showAll();
  36. }
  37. public void initUI() {
  38. label = new Label("...");
  39. entry = new Entry();
  40. entry.connect(new Entry.Changed() {
  41. public void onChanged(Editable editable) {
  42. label.setLabel(entry.getText());
  43. }
  44. });
  45. Fixed fix = new Fixed();
  46. fix.put(entry, 60, 100);
  47. fix.put(label, 60, 40);
  48. add(fix);
  49. }
  50. public static void main(String[] args) {
  51. Gtk.init(args);
  52. new GEntry();
  53. Gtk.main();
  54. }
  55. }

此示例显示了条目小部件和标签。 我们输入的文本将立即显示在标签控件中。

  1. entry = new Entry();

Entry小部件已创建。

  1. entry.connect(new Entry.Changed() {
  2. public void onChanged(Editable editable) {
  3. label.setLabel(entry.getText());
  4. }
  5. });

如果Entry小部件中的文本被更改,我们将调用onChanged()方法。 在这种方法中,我们从Entry小部件中获取文本并将其设置为标签。

Java Gnome 中的小部件 II - 图1

图:Entry小部件

HScale

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

hscale.java

  1. package com.zetcode;
  2. import java.io.FileNotFoundException;
  3. import org.gnome.gdk.Event;
  4. import org.gnome.gdk.Pixbuf;
  5. import org.gnome.gtk.Fixed;
  6. import org.gnome.gtk.Gtk;
  7. import org.gnome.gtk.HScale;
  8. import org.gnome.gtk.Image;
  9. import org.gnome.gtk.Range;
  10. import org.gnome.gtk.Widget;
  11. import org.gnome.gtk.Window;
  12. import org.gnome.gtk.WindowPosition;
  13. /**
  14. * Java Gnome tutorial
  15. *
  16. * This program shows how to use
  17. * the HScale widget. It implements a
  18. * volume control.
  19. *
  20. * @author jan bodnar
  21. * website zetcode.com
  22. * last modified March 2009
  23. */
  24. public class GHScale extends Window {
  25. private HScale hscale;
  26. private Image image;
  27. private Pixbuf mute;
  28. private Pixbuf min;
  29. private Pixbuf med;
  30. private Pixbuf max;
  31. public GHScale() {
  32. setTitle("HScale");
  33. initUI();
  34. connect(new Window.DeleteEvent() {
  35. public boolean onDeleteEvent(Widget source, Event event) {
  36. Gtk.mainQuit();
  37. return false;
  38. }
  39. });
  40. setDefaultSize(260, 120);
  41. setPosition(WindowPosition.CENTER);
  42. showAll();
  43. }
  44. public void initUI() {
  45. loadImages();
  46. hscale = new HScale(0, 99, 1);
  47. hscale.setSizeRequest(130, 45);
  48. hscale.setCanFocus(false);
  49. image = new Image("mute.png");
  50. hscale.connect(new HScale.ValueChanged() {
  51. public void onValueChanged(Range range) {
  52. int pos = (int) hscale.getValue();
  53. if (pos == 0) {
  54. image.setImage(mute);
  55. } else if (pos > 0 && pos <= 30) {
  56. image.setImage(min);
  57. } else if (pos > 30 && pos < 80) {
  58. image.setImage(med);
  59. } else {
  60. image.setImage(max);
  61. }
  62. }
  63. });
  64. Fixed fixed = new Fixed();
  65. fixed.put(hscale, 40, 20);
  66. fixed.put(image, 220, 40);
  67. add(fixed);
  68. }
  69. private void loadImages() {
  70. try {
  71. mute = new Pixbuf("mute.png");
  72. min = new Pixbuf("min.png");
  73. med = new Pixbuf("med.png");
  74. max = new Pixbuf("max.png");
  75. } catch (FileNotFoundException e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. public static void main(String[] args) {
  80. Gtk.init(args);
  81. new GHScale();
  82. Gtk.main();
  83. }
  84. }

在上面的示例中,我们有HScaleImage小部件。 通过拖动比例尺,我们可以在Image小部件上更改图像。

  1. hscale = new HScale(0, 99, 1);

HScale小部件已创建。 参数是下边界,上边界和阶跃。

  1. int pos = (int) hscale.getValue();

onValueChanged()方法中,我们获得了比例小部件的值。

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

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

Java Gnome 中的小部件 II - 图2

图:HScale小部件

ToggleButton

ToggleButton是具有两种状态的按钮。 已按下但未按下。 通过单击可以在这两种状态之间切换。 在某些情况下此功能非常合适。

togglebuttons.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Color;
  3. import org.gnome.gdk.Event;
  4. import org.gnome.gtk.DrawingArea;
  5. import org.gnome.gtk.Fixed;
  6. import org.gnome.gtk.Gtk;
  7. import org.gnome.gtk.StateType;
  8. import org.gnome.gtk.ToggleButton;
  9. import org.gnome.gtk.Widget;
  10. import org.gnome.gtk.Window;
  11. import org.gnome.gtk.WindowPosition;
  12. /**
  13. * ZetCode Java Gnome tutorial
  14. *
  15. * This program demonstrates the ToggleButton
  16. * widget. Three toggle buttons control the
  17. * color of a drawing area.
  18. *
  19. * @author jan bodnar
  20. * website zetcode.com
  21. * last modified March 2009
  22. */
  23. public class GToggleButton extends Window
  24. implements ToggleButton.Toggled {
  25. private ToggleButton tb1;
  26. private ToggleButton tb2;
  27. private ToggleButton tb3;
  28. private DrawingArea darea;
  29. private Color color;
  30. public GToggleButton() {
  31. setTitle("ToggleButton");
  32. initUI();
  33. setPosition(WindowPosition.CENTER);
  34. setSizeRequest(350, 220);
  35. showAll();
  36. }
  37. public void initUI() {
  38. color = new Color(0, 0, 0);
  39. connect(new Window.DeleteEvent() {
  40. public boolean onDeleteEvent(Widget source, Event event) {
  41. Gtk.mainQuit();
  42. return false;
  43. }
  44. });
  45. Fixed fixed = new Fixed();
  46. tb1 = new ToggleButton("Red");
  47. tb1.setSizeRequest(80, 35);
  48. tb1.connect(this);
  49. tb2 = new ToggleButton("Green");
  50. tb2.setSizeRequest(80, 35);
  51. tb2.connect(this);
  52. tb3 = new ToggleButton("Blue");
  53. tb3.setSizeRequest(80, 35);
  54. tb3.connect(this);
  55. darea = new DrawingArea();
  56. darea.modifyBackground(StateType.NORMAL, Color.BLACK);
  57. darea.setSizeRequest(150, 150);
  58. fixed.put(tb1, 20, 20);
  59. fixed.put(tb2, 20, 65);
  60. fixed.put(tb3, 20, 110);
  61. fixed.put(darea, 150, 20);
  62. add(fixed);
  63. }
  64. public void onToggled(ToggleButton toggleButton) {
  65. int red = color.getRed();
  66. int green = color.getGreen();
  67. int blue = color.getBlue();
  68. if ("Red".equals(toggleButton.getLabel())) {
  69. if (toggleButton.getActive()) {
  70. red = 65535;
  71. } else {
  72. red = 0;
  73. }
  74. }
  75. if ("Green".equals(toggleButton.getLabel())) {
  76. if (toggleButton.getActive()) {
  77. green = 65535;
  78. } else {
  79. green = 0;
  80. }
  81. }
  82. if ("Blue".equals(toggleButton.getLabel())) {
  83. if (toggleButton.getActive()) {
  84. blue = 65535;
  85. } else {
  86. blue = 0;
  87. }
  88. }
  89. color = new Color(red, green, blue);
  90. darea.modifyBackground(StateType.NORMAL, color);
  91. }
  92. public static void main(String[] args) {
  93. Gtk.init(args);
  94. new GToggleButton();
  95. Gtk.main();
  96. }
  97. }

在我们的示例中,我们显示了三个切换按钮和一个DrawingArea。 我们将区域的背景色设置为黑色。 切换按钮将切换颜色值的红色,绿色和蓝色部分。 背景颜色取决于我们按下的切换按钮。

  1. color = new Color(0, 0, 0);

这是将使用切换按钮更新的颜色值。

  1. tb1 = new ToggleButton("Red");
  2. tb1.setSizeRequest(80, 35);
  3. tb1.connect(this);

ToggleButton小部件已创建。 我们将其大小设置为80x35像素。 它连接到onToggled()方法。

  1. darea = new DrawingArea();
  2. darea.modifyBackground(StateType.NORMAL, Color.BLACK);
  3. darea.setSizeRequest(150, 150);

DrawingArea小部件是显示颜色的小部件,由切换按钮混合。 开始时,它显示为黑色。

  1. if ("Red".equals(toggleButton.getLabel())) {
  2. if (toggleButton.getActive()) {
  3. red = 65535;
  4. } else {
  5. red = 0;
  6. }
  7. }

我们根据红色切换按钮的状态更新颜色的红色部分。

  1. color = new Color(red, green, blue);
  2. darea.modifyBackground(StateType.NORMAL, color);

颜色值将更新并设置为DrawingArea小部件。

Java Gnome 中的小部件 II - 图3

图:ToggleButton widget

Calendar

我们最终的窗口小部件是Calendar小部件。 它用于处理日期。

calendar.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Calendar;
  4. import org.gnome.gtk.Gtk;
  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. * ZetCode Java Gnome tutorial
  12. *
  13. * This program demonstrates the Calendar
  14. * widget. We show a selected date in a
  15. * label widget.
  16. *
  17. * @author jan bodnar
  18. * website zetcode.com
  19. * last modified March 2009
  20. */
  21. public class GCalendar extends Window {
  22. private Calendar calendar;
  23. private Label label;
  24. public GCalendar() {
  25. setTitle("Calendar");
  26. initUI();
  27. connect(new Window.DeleteEvent() {
  28. public boolean onDeleteEvent(Widget source, Event event) {
  29. Gtk.mainQuit();
  30. return false;
  31. }
  32. });
  33. setDefaultSize(260, 120);
  34. setPosition(WindowPosition.CENTER);
  35. showAll();
  36. }
  37. private void initUI() {
  38. VBox vbox = new VBox(false, 1);
  39. calendar = new Calendar();
  40. label = new Label(getDate());
  41. calendar.connect(new Calendar.DaySelected() {
  42. public void onDaySelected(Calendar calendar) {
  43. label.setLabel(getDate());
  44. }
  45. });
  46. vbox.add(calendar);
  47. label.setSizeRequest(-1, 50);
  48. vbox.add(label);
  49. add(vbox);
  50. }
  51. private String getDate() {
  52. int year = calendar.getDateYear();
  53. int month = calendar.getDateMonth();
  54. int day = calendar.getDateDay();
  55. String dateLabel = month + "/" + day + "/" + year;
  56. return dateLabel;
  57. }
  58. public static void main(String[] args) {
  59. Gtk.init(args);
  60. new GCalendar();
  61. Gtk.main();
  62. }
  63. }

我们有Calendar小部件和Label。 从日历中选择的日期显示在标签中。

  1. calendar = new Calendar();

Calendar小部件已创建。

  1. public void onDaySelected(Calendar calendar) {
  2. label.setLabel(getDate());
  3. };

onDaySelected()方法中,我们将标签更新为当前选择的日期。

Java Gnome 中的小部件 II - 图4

图:日历

在本章中,我们结束了 Java Gnome 中的小部件的讨论。