在 Java Gnome 编程教程的这一部分中,我们将讨论事件。
Java Gnome 库是事件驱动的系统。 所有 GUI 应用都是事件驱动的。 应用启动一个主循环,该循环不断检查新生成的事件。 如果没有事件,则应用将等待并且不执行任何操作。
简单事件示例
下一个示例显示了我们如何应对两个基本事件。
quitbutton.java
package com.zetcode;import org.gnome.gdk.Event;import org.gnome.gtk.Button;import org.gnome.gtk.Fixed;import org.gnome.gtk.Gtk;import org.gnome.gtk.Widget;import org.gnome.gtk.Window;import org.gnome.gtk.WindowPosition;/*** Java Gnome tutorial** This program demonstrates two* basic events.** @author jan bodnar* website zetcode.com* last modified March 2009*/public class GButton extends Window {public GButton() {setTitle("Button");initUI();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();Button quit = new Button("Quit");quit.connect(new Button.Clicked() {public void onClicked(Button button) {Gtk.mainQuit();}});quit.setSizeRequest(80, 35);fixed.put(quit, 50, 50);add(fixed);setSizeRequest(250, 200);}public static void main(String[] args) {Gtk.init(args);new GButton();Gtk.main();}}
在我们的代码示例中,我们对两个事件做出反应。 删除事件和单击事件。 当我们关闭窗口时,将触发删除事件。 默认情况下,该窗口被销毁,但应用不退出。 我们必须明确退出该程序。
connect(new Window.DeleteEvent() {public boolean onDeleteEvent(Widget source, Event event) {Gtk.mainQuit();return false;}});
如果单击窗口的关闭按钮,则窗口将被破坏。 但是应用并未完全销毁。 我们必须调用Gtk.mainQuit()结束应用。 我们使用connect()方法将回调方法连接到特定事件类型。 在我们的例子中是DeleteEvent。
quit.connect(new Button.Clicked() {public void onClicked(Button button) {Gtk.mainQuit();}});
当我们单击按钮小部件时,将触发onClicked()方法。 我们对按钮单击做出反应,退出了应用。
移动窗口
下一个示例显示了我们如何对移动窗口事件做出反应。 我们在标题栏中显示窗口左上角的当前位置。
move.java
package com.zetcode;import org.gnome.gdk.Event;import org.gnome.gdk.EventConfigure;import org.gnome.gtk.Gtk;import org.gnome.gtk.Widget;import org.gnome.gtk.Window;import org.gnome.gtk.WindowPosition;/*** ZetCode Java Gnome tutorial** This program demonstrates the* configure event.** @author jan bodnar* website zetcode.com* last modified March 2009*/public class GMoveWindow extends Windowimplements Window.ConfigureEvent {public GMoveWindow() {connect(new Window.DeleteEvent() {public boolean onDeleteEvent(Widget source, Event event) {Gtk.mainQuit();return false;}});connect(this);setPosition(WindowPosition.CENTER);setTitle("");resize(250, 200);showAll();}public boolean onConfigureEvent(Widget widget,EventConfigure eventConfigure) {int x = eventConfigure.getX();int y = eventConfigure.getY();setTitle(x + ", " + y);return false;}public static void main(String[] args) {Gtk.init(args);new GMoveWindow();Gtk.main();}}
调整大小和移动窗口最终导致创建ConfigureEvent。
public boolean onConfigureEvent(Widget widget,EventConfigure eventConfigure) {int x = eventConfigure.getX();int y = eventConfigure.getY();setTitle(x + ", " + y);return false;}
我们将窗口的 x,y 坐标设置为窗口的标题栏。

图:移动事件
EnterNotifyEvent
当我们使用鼠标指针进入小部件的区域时,会发出EnterNotifyEvent。
enter.java
package com.zetcode;import org.gnome.gdk.Color;import org.gnome.gdk.Event;import org.gnome.gdk.EventCrossing;import org.gnome.gtk.Button;import org.gnome.gtk.Fixed;import org.gnome.gtk.Gtk;import org.gnome.gtk.StateType;import org.gnome.gtk.Widget;import org.gnome.gtk.Window;import org.gnome.gtk.WindowPosition;/*** ZetCode Java Gnome tutorial** This program demonstrates the* EnterNotifyEvent.** @author jan bodnar* website zetcode.com* last modified March 2009*/public class GEnterNotifyEvent extends Window {private Color lightGray = new Color(55000, 55000, 55000);public GEnterNotifyEvent() {setTitle("EnterNotifyEvent");initUI();connect(new Window.DeleteEvent() {public boolean onDeleteEvent(Widget source, Event event) {Gtk.mainQuit();return false;}});setDefaultSize(250, 150);setPosition(WindowPosition.CENTER);showAll();}public void initUI() {Button button = new Button("Button");button.setSizeRequest(80, 30);button.connect(new Button.EnterNotifyEvent() {public boolean onEnterNotifyEvent(Widget widget,EventCrossing eventCrossing) {widget.modifyBackground(StateType.PRELIGHT, lightGray);return false;}});Fixed fix = new Fixed();fix.put(button, 20, 20);add(fix);}public static void main(String[] args) {Gtk.init(args);new GEnterNotifyEvent();Gtk.main();}}
一旦将鼠标指针悬停在按钮小部件上,我们将更改其背景颜色。
button.connect(new Button.EnterNotifyEvent() {public boolean onEnterNotifyEvent(Widget widget,EventCrossing eventCrossing) {widget.modifyBackground(StateType.PRELIGHT, lightGray);return false;}});
在这里,我们对EnterNotifyEvent做出反应。
widget.modifyBackground(StateType.PRELIGHT, lightGray);
我们修改按钮背景的颜色。
本章介绍 Java Gnome 中的事件。
