多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Java Gnome 中的小部件 II > 原文: [http://zetcode.com/gui/javagnome/widgetsII/](http://zetcode.com/gui/javagnome/widgetsII/) 在 Java Gnome 编程教程的这一部分中,我们继续介绍小部件。 ## `Entry` `Entry`是单行文本输入字段。 该小部件用于输入文本数据。 `entry.java` ```java package com.zetcode; import org.gnome.gdk.Event; import org.gnome.gtk.Editable; import org.gnome.gtk.Entry; import org.gnome.gtk.Fixed; 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 shows how to use * an Entry widget. * * @author jan bodnar * website zetcode.com * last modified March 2009 */ public class GEntry extends Window { private Label label; private Entry entry; public GEntry() { setTitle("Entry"); initUI(); connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { Gtk.mainQuit(); return false; } }); setDefaultSize(250, 200); setPosition(WindowPosition.CENTER); showAll(); } public void initUI() { label = new Label("..."); entry = new Entry(); entry.connect(new Entry.Changed() { public void onChanged(Editable editable) { label.setLabel(entry.getText()); } }); Fixed fix = new Fixed(); fix.put(entry, 60, 100); fix.put(label, 60, 40); add(fix); } public static void main(String[] args) { Gtk.init(args); new GEntry(); Gtk.main(); } } ``` 此示例显示了条目小部件和标签。 我们输入的文本将立即显示在标签控件中。 ```java entry = new Entry(); ``` `Entry`小部件已创建。 ```java entry.connect(new Entry.Changed() { public void onChanged(Editable editable) { label.setLabel(entry.getText()); } }); ``` 如果`Entry`小部件中的文本被更改,我们将调用`onChanged()`方法。 在这种方法中,我们从`Entry`小部件中获取文本并将其设置为标签。 ![Entry Widget](https://img.kancloud.cn/a2/bd/a2bddaaa8060db206a51831315c6244f_256x225.jpg) 图:`Entry`小部件 ## `HScale` `Scale`是一个小部件,可让用户通过在有限间隔内滑动旋钮以图形方式选择一个值。 我们的示例将显示音量控制。 `hscale.java` ```java package com.zetcode; import java.io.FileNotFoundException; import org.gnome.gdk.Event; import org.gnome.gdk.Pixbuf; import org.gnome.gtk.Fixed; import org.gnome.gtk.Gtk; import org.gnome.gtk.HScale; import org.gnome.gtk.Image; import org.gnome.gtk.Range; import org.gnome.gtk.Widget; import org.gnome.gtk.Window; import org.gnome.gtk.WindowPosition; /** * Java Gnome tutorial * * This program shows how to use * the HScale widget. It implements a * volume control. * * @author jan bodnar * website zetcode.com * last modified March 2009 */ public class GHScale extends Window { private HScale hscale; private Image image; private Pixbuf mute; private Pixbuf min; private Pixbuf med; private Pixbuf max; public GHScale() { setTitle("HScale"); initUI(); connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { Gtk.mainQuit(); return false; } }); setDefaultSize(260, 120); setPosition(WindowPosition.CENTER); showAll(); } public void initUI() { loadImages(); hscale = new HScale(0, 99, 1); hscale.setSizeRequest(130, 45); hscale.setCanFocus(false); image = new Image("mute.png"); hscale.connect(new HScale.ValueChanged() { public void onValueChanged(Range range) { int pos = (int) hscale.getValue(); if (pos == 0) { image.setImage(mute); } else if (pos > 0 && pos <= 30) { image.setImage(min); } else if (pos > 30 && pos < 80) { image.setImage(med); } else { image.setImage(max); } } }); Fixed fixed = new Fixed(); fixed.put(hscale, 40, 20); fixed.put(image, 220, 40); add(fixed); } private void loadImages() { try { mute = new Pixbuf("mute.png"); min = new Pixbuf("min.png"); med = new Pixbuf("med.png"); max = new Pixbuf("max.png"); } catch (FileNotFoundException e) { e.printStackTrace(); } } public static void main(String[] args) { Gtk.init(args); new GHScale(); Gtk.main(); } } ``` 在上面的示例中,我们有`HScale`和`Image`小部件。 通过拖动比例尺,我们可以在`Image`小部件上更改图像。 ```java hscale = new HScale(0, 99, 1); ``` `HScale`小部件已创建。 参数是下边界,上边界和阶跃。 ```java int pos = (int) hscale.getValue(); ``` 在`onValueChanged()`方法中,我们获得了比例小部件的值。 ```java if (pos == 0) { image.setImage(mute); } else if (pos > 0 && pos <= 30) { image.setImage(min); } else if (pos > 30 && pos < 80) { image.setImage(med); } else { image.setImage(max); } ``` 根据获得的值,我们在图像小部件中更改图片。 ![HScale Widget](https://img.kancloud.cn/95/6f/956f96184d4eee4efa62f234e1b64108_266x145.jpg) 图:`HScale`小部件 ## `ToggleButton` `ToggleButton`是具有两种状态的按钮。 已按下但未按下。 通过单击可以在这两种状态之间切换。 在某些情况下此功能非常合适。 `togglebuttons.java` ```java package com.zetcode; import org.gnome.gdk.Color; import org.gnome.gdk.Event; import org.gnome.gtk.DrawingArea; import org.gnome.gtk.Fixed; import org.gnome.gtk.Gtk; import org.gnome.gtk.StateType; 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 demonstrates the ToggleButton * widget. Three toggle buttons control the * color of a drawing area. * * @author jan bodnar * website zetcode.com * last modified March 2009 */ public class GToggleButton extends Window implements ToggleButton.Toggled { private ToggleButton tb1; private ToggleButton tb2; private ToggleButton tb3; private DrawingArea darea; private Color color; public GToggleButton() { setTitle("ToggleButton"); initUI(); setPosition(WindowPosition.CENTER); setSizeRequest(350, 220); showAll(); } public void initUI() { color = new Color(0, 0, 0); connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { Gtk.mainQuit(); return false; } }); Fixed fixed = new Fixed(); tb1 = new ToggleButton("Red"); tb1.setSizeRequest(80, 35); tb1.connect(this); tb2 = new ToggleButton("Green"); tb2.setSizeRequest(80, 35); tb2.connect(this); tb3 = new ToggleButton("Blue"); tb3.setSizeRequest(80, 35); tb3.connect(this); darea = new DrawingArea(); darea.modifyBackground(StateType.NORMAL, Color.BLACK); darea.setSizeRequest(150, 150); fixed.put(tb1, 20, 20); fixed.put(tb2, 20, 65); fixed.put(tb3, 20, 110); fixed.put(darea, 150, 20); add(fixed); } public void onToggled(ToggleButton toggleButton) { int red = color.getRed(); int green = color.getGreen(); int blue = color.getBlue(); if ("Red".equals(toggleButton.getLabel())) { if (toggleButton.getActive()) { red = 65535; } else { red = 0; } } if ("Green".equals(toggleButton.getLabel())) { if (toggleButton.getActive()) { green = 65535; } else { green = 0; } } if ("Blue".equals(toggleButton.getLabel())) { if (toggleButton.getActive()) { blue = 65535; } else { blue = 0; } } color = new Color(red, green, blue); darea.modifyBackground(StateType.NORMAL, color); } public static void main(String[] args) { Gtk.init(args); new GToggleButton(); Gtk.main(); } } ``` 在我们的示例中,我们显示了三个切换按钮和一个`DrawingArea`。 我们将区域的背景色设置为黑色。 切换按钮将切换颜色值的红色,绿色和蓝色部分。 背景颜色取决于我们按下的切换按钮。 ```java color = new Color(0, 0, 0); ``` 这是将使用切换按钮更新的颜色值。 ```java tb1 = new ToggleButton("Red"); tb1.setSizeRequest(80, 35); tb1.connect(this); ``` `ToggleButton`小部件已创建。 我们将其大小设置为`80x35`像素。 它连接到`onToggled()`方法。 ```java darea = new DrawingArea(); darea.modifyBackground(StateType.NORMAL, Color.BLACK); darea.setSizeRequest(150, 150); ``` `DrawingArea`小部件是显示颜色的小部件,由切换按钮混合。 开始时,它显示为黑色。 ```java if ("Red".equals(toggleButton.getLabel())) { if (toggleButton.getActive()) { red = 65535; } else { red = 0; } } ``` 我们根据红色切换按钮的状态更新颜色的红色部分。 ```java color = new Color(red, green, blue); darea.modifyBackground(StateType.NORMAL, color); ``` 颜色值将更新并设置为`DrawingArea`小部件。 ![ToggleButton widget](https://img.kancloud.cn/bb/fe/bbfe7ebe7ad850932e8c199c1719b64c_356x245.jpg) 图:`ToggleButton` widget ## `Calendar` 我们最终的窗口小部件是`Calendar`小部件。 它用于处理日期。 `calendar.java` ```java package com.zetcode; import org.gnome.gdk.Event; import org.gnome.gtk.Calendar; import org.gnome.gtk.Gtk; 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; /** * ZetCode Java Gnome tutorial * * This program demonstrates the Calendar * widget. We show a selected date in a * label widget. * * @author jan bodnar * website zetcode.com * last modified March 2009 */ public class GCalendar extends Window { private Calendar calendar; private Label label; public GCalendar() { setTitle("Calendar"); initUI(); connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { Gtk.mainQuit(); return false; } }); setDefaultSize(260, 120); setPosition(WindowPosition.CENTER); showAll(); } private void initUI() { VBox vbox = new VBox(false, 1); calendar = new Calendar(); label = new Label(getDate()); calendar.connect(new Calendar.DaySelected() { public void onDaySelected(Calendar calendar) { label.setLabel(getDate()); } }); vbox.add(calendar); label.setSizeRequest(-1, 50); vbox.add(label); add(vbox); } private String getDate() { int year = calendar.getDateYear(); int month = calendar.getDateMonth(); int day = calendar.getDateDay(); String dateLabel = month + "/" + day + "/" + year; return dateLabel; } public static void main(String[] args) { Gtk.init(args); new GCalendar(); Gtk.main(); } } ``` 我们有`Calendar`小部件和`Label`。 从日历中选择的日期显示在标签中。 ```java calendar = new Calendar(); ``` `Calendar`小部件已创建。 ```java public void onDaySelected(Calendar calendar) { label.setLabel(getDate()); }; ``` 在`onDaySelected()`方法中,我们将标签更新为当前选择的日期。 ![Calendar](https://img.kancloud.cn/79/a7/79a7d586f0d110e807b412ae6bc5dc1e_266x248.jpg) 图:日历 在本章中,我们结束了 Java Gnome 中的小部件的讨论。