在 Java Gnome 编程教程的这一部分中,我们将介绍一些小部件。
小部件是 GUI 应用的基本构建块。 多年来,几个小部件已成为所有 OS 平台上所有工具包中的标准。 例如,按钮,复选框或滚动条。 GTK+ 工具箱的理念是将小部件的数量保持在最低水平。 将创建更多专门的小部件作为自定义小部件。
Label
Label小部件显示文本。
label.java
package com.zetcode;import org.gnome.gdk.Event;import org.gnome.gtk.Gtk;import org.gnome.gtk.Label;import org.gnome.gtk.Widget;import org.gnome.gtk.Window;import org.gnome.gtk.WindowPosition;/*** ZetCode Java Gnome tutorial** This program uses Label widget* to display text.** @author jan bodnar* website zetcode.com* last modified March 2009*/public class GLabel extends Window {public GLabel() {setTitle("Death song");initUI();connect(new Window.DeleteEvent() {public boolean onDeleteEvent(Widget source, Event event) {Gtk.mainQuit();return false;}});setPosition(WindowPosition.CENTER);showAll();}public void initUI() {Label lyrics = new Label("Lets sing the death song kids\n\n" +"We light a candle on an earth\n" +"We made into hell\n" +"And pretend that were in heaven\n" +"Each time we do we get\n" +"The blind mans ticket\n" +"And we know that nothings true\n" +"I saw priest kill a cop on the tv\n" +"And I know now theyre our heroes too\n\n" +"We sing the death song kids\n" +"Because weve got no future\n" +"And we want to be just like you\n" +"And we want to be just like you\n");add(lyrics);setBorderWidth(8);}public static void main(String[] args) {Gtk.init(args);new GLabel();Gtk.main();}}
该代码示例在窗口上显示了一些歌词。
Label lyrics = new Label("Lets sing the death song kids\n\n" +"We light a candle on an earth\n" +...
这是我们将在Label小部件中显示的文本。
setBorderWidth(8);
Label周围有一些空白。

图:Label小部件
HSeparator
HSeparator是一个装饰小部件,可用于分隔窗口上的项目。
separator.java
package com.zetcode;import org.gnome.gdk.Event;import org.gnome.gtk.Gtk;import org.gnome.gtk.HSeparator;import org.gnome.gtk.Label;import org.gnome.gtk.VBox;import org.gnome.gtk.Widget;import org.gnome.gtk.Window;import org.gnome.gtk.WindowPosition;/*** Java Gnome tutorial** This program shows how to use* a horizontal separator.** @author jan bodnar* website zetcode.com* last modified March 2009*/public class GHSeparator extends Window {private final int VERTICAL_SPACE = 15;private final int BORDER_AROUND = 25;private final float Y_ALIGN = 0f;private final float X_ALIGN = 0f;public GHSeparator() {setTitle("HSeparator");initUI();connect(new Window.DeleteEvent() {public boolean onDeleteEvent(Widget source, Event event) {Gtk.mainQuit();return false;}});setPosition(WindowPosition.CENTER);showAll();}public void initUI() {VBox vbox = new VBox(false, VERTICAL_SPACE);Label zinc = new Label("Zinc is a moderately reactive, blue" +"gray metal that tarnishes in moist air and burns in air of zinc " +"oxide. It reacts with acids, alkalis and other non-metals. If not" +"completely pure, zinc reacts with dilute acids to release hydrogen.");zinc.setLineWrap(true);zinc.setAlignment(X_ALIGN, Y_ALIGN);vbox.packStart(zinc);HSeparator hsep = new HSeparator();vbox.packStart(hsep);Label copper = new Label("Copper is an essential trace nutrient to" +"all high plants and animals. In animals, including humans," +"it is found primarily in the bloodstream, as a co-factor in various" +"enzymes, and in copper-based pigments. However, in sufficient" +"amounts, copper can be poisonous and even fatal to organisms.");copper.setAlignment(X_ALIGN, Y_ALIGN);copper.setLineWrap(true);vbox.packStart(copper);add(vbox);setResizable(false);setBorderWidth(BORDER_AROUND);}public static void main(String[] args) {Gtk.init(args);new GHSeparator();Gtk.main();}}
在我们的代码示例中,我们描述了两个化学元素,它们由水平分隔符分隔。
zinc.setLineWrap(true);
该行换行。 对于较长的文本,这是必需的。
zinc.setAlignment(X_ALIGN, Y_ALIGN);
此代码行使文本左对齐。
HSeparator hsep = new HSeparator();vbox.packStart(hsep);
HSeparator小部件已创建并放置在两个标签小部件之间。

图:HSeparator
CheckButton
CheckButton是具有两种状态的窗口小部件:打开和关闭。 接通状态通过复选标记显示。 它用来表示一些布尔属性。
checkbutton.java
package com.zetcode;import org.gnome.gdk.Event;import org.gnome.gtk.CheckButton;import org.gnome.gtk.Fixed;import org.gnome.gtk.Gtk;import org.gnome.gtk.ToggleButton;import org.gnome.gtk.Widget;import org.gnome.gtk.Window;import org.gnome.gtk.WindowPosition;/*** ZetCode Java Gnome tutorial** This program uses a CheckButton to* toggle the visibility of a window title.** @author jan bodnar* website zetcode.com* last modified March 2009*/public class GCheckButton extends Window implements ToggleButton.Toggled {CheckButton check;Window window;private String title = "Check Button";public GCheckButton() {setTitle(title);initUI();connect(new Window.DeleteEvent() {public boolean onDeleteEvent(Widget source, Event event) {Gtk.mainQuit();return false;}});setSizeRequest(250, 200);showAll();}public void initUI() {setBorderWidth(10);Fixed fixed = new Fixed();check = new CheckButton("Show title");check.setActive(true);check.connect(this);check.setCanFocus(false);fixed.put(check, 50, 50);add(fixed);setPosition(WindowPosition.CENTER);}public void onToggled(ToggleButton toggleButton) {if (check.getActive()) {setTitle(title);} else {setTitle("");}}public static void main(String[] args) {Gtk.init(args);new GCheckButton();Gtk.main();}}
根据CheckButton的状态,我们将在窗口的标题栏中显示标题。
check = new CheckButton("Show title");
CheckButton小部件已创建。
check.setActive(true);
默认情况下标题是可见的,因此我们默认情况下选中复选按钮。
if (check.getActive()) {setTitle(title);} else {setTitle("");}
根据CheckButton的状态,我们显示或隐藏窗口的标题。

图:CheckButton
TextComboBox
TextComboBox是一个小部件,允许用户从文本选项列表中进行选择。
textcombobox.java
package com.zetcode;import org.gnome.gdk.Event;import org.gnome.gtk.ComboBox;import org.gnome.gtk.Fixed;import org.gnome.gtk.Gtk;import org.gnome.gtk.Label;import org.gnome.gtk.TextComboBox;import org.gnome.gtk.Widget;import org.gnome.gtk.Window;import org.gnome.gtk.WindowPosition;/*** ZetCode Java Gnome tutorial** This program shows how to use* a TextComboBox.** @author jan bodnar* website zetcode.com* last modified March 2009*/public class GTextComboBox extends Window implements ComboBox.Changed {TextComboBox cb;Label label;public GTextComboBox() {setTitle("TextComboBox");initUI();setSizeRequest(250, 200);setPosition(WindowPosition.CENTER);showAll();}public void initUI() {connect(new Window.DeleteEvent() {public boolean onDeleteEvent(Widget source, Event event) {Gtk.mainQuit();return false;}});Fixed fixed = new Fixed();label = new Label("");fixed.put(label, 55, 130);cb = new TextComboBox();cb.appendText("Ubuntu");cb.appendText("Mandriva");cb.appendText("Fedora");cb.appendText("Mint");cb.appendText("Debian");cb.appendText("Gentoo");cb.connect(this);fixed.put(cb, 50, 50);add(fixed);}public void onChanged(ComboBox comboBox) {String text = cb.getActiveText();label.setLabel(text);}public static void main(String[] args) {Gtk.init(args);new GTextComboBox();Gtk.main();}}
该示例显示了一个文本组合框和一个标签。 文本组合框具有六个选项的列表。 这些是 Linux Distros 的名称。 标签窗口小部件显示了从文本组合框中选择的选项。
cb = new TextComboBox();
TextComboBox小部件已创建。
cb.appendText("Ubuntu");
调用appendText()方法来填充文本组合框。
public void onChanged(ComboBox comboBox) {String text = cb.getActiveText();label.setLabel(text);}
当我们从文本组合框中选择一个选项时,将调用onChanged()方法。 我们获取选定的文本并将其设置为标签小部件。

图:TextComboBox
Image
下一个示例介绍Image小部件。 此小部件显示图片。
image.java
package com.zetcode;import org.gnome.gdk.Event;import org.gnome.gtk.Gtk;import org.gnome.gtk.Image;import org.gnome.gtk.Widget;import org.gnome.gtk.Window;import org.gnome.gtk.WindowPosition;/*** ZetCode Java Gnome tutorial** This program shows an image of a castle* in the window.** @author jan bodnar* website zetcode.com* last modified March 2009*/public class GImage extends Window {public GImage() {setTitle("Red Rock");initUI();setPosition(WindowPosition.CENTER);showAll();}public void initUI() {connect(new Window.DeleteEvent() {public boolean onDeleteEvent(Widget source, Event event) {Gtk.mainQuit();return false;}});Image image = new Image("redrock.png");int width = image.getRequisition().getWidth();int height = image.getRequisition().getHeight();setSizeRequest(width, height);add(image);setBorderWidth(2);}public static void main(String[] args) {Gtk.init(args);new GImage();Gtk.main();}}
我们在窗口中显示红色岩石城堡。
Image image = new Image("redrock.png");
我们创建Image小部件的实例。 请注意,我们不会捕获任何异常。 图像小部件已经可以处理它们。 如果“图像”小部件找不到redrock.png图像,则默认情况下将显示丢失的图像。
Image image = new Image(castle);Add(image);
Image小部件已创建并添加到窗口。

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