ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Java Gnome 中的事件 > 原文: [http://zetcode.com/gui/javagnome/events/](http://zetcode.com/gui/javagnome/events/) 在 Java Gnome 编程教程的这一部分中,我们将讨论事件。 Java Gnome 库是事件驱动的系统。 所有 GUI 应用都是事件驱动的。 应用启动一个主循环,该循环不断检查新生成的事件。 如果没有事件,则应用将等待并且不执行任何操作。 ## 简单事件示例 下一个示例显示了我们如何应对两个基本事件。 `quitbutton.java` ```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(); } } ``` 在我们的代码示例中,我们对两个事件做出反应。 删除事件和单击事件。 当我们关闭窗口时,将触发删除事件。 默认情况下,该窗口被销毁,但应用不退出。 我们必须明确退出该程序。 ```java connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { Gtk.mainQuit(); return false; } }); ``` 如果单击窗口的关闭按钮,则窗口将被破坏。 但是应用并未完全销毁。 我们必须调用`Gtk.mainQuit()`结束应用。 我们使用`connect()`方法将回调方法连接到特定事件类型。 在我们的例子中是`DeleteEvent`。 ```java quit.connect(new Button.Clicked() { public void onClicked(Button button) { Gtk.mainQuit(); } }); ``` 当我们单击按钮小部件时,将触发`onClicked()`方法。 我们对按钮单击做出反应,退出了应用。 ## 移动窗口 下一个示例显示了我们如何对移动窗口事件做出反应。 我们在标题栏中显示窗口左上角的当前位置。 `move.java` ```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 Window implements 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`。 ```java public boolean onConfigureEvent(Widget widget, EventConfigure eventConfigure) { int x = eventConfigure.getX(); int y = eventConfigure.getY(); setTitle(x + ", " + y); return false; } ``` 我们将窗口的 x,y 坐标设置为窗口的标题栏。 ![Move event](https://img.kancloud.cn/49/cd/49cd857f10d41dd0bc03de801a35bd75_256x225.jpg) 图:移动事件 ## `EnterNotifyEvent` 当我们使用鼠标指针进入小部件的区域时,会发出`EnterNotifyEvent`。 `enter.java` ```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(); } } ``` 一旦将鼠标指针悬停在按钮小部件上,我们将更改其背景颜色。 ```java button.connect(new Button.EnterNotifyEvent() { public boolean onEnterNotifyEvent(Widget widget, EventCrossing eventCrossing) { widget.modifyBackground(StateType.PRELIGHT, lightGray); return false; } }); ``` 在这里,我们对`EnterNotifyEvent`做出反应。 ```java widget.modifyBackground(StateType.PRELIGHT, lightGray); ``` 我们修改按钮背景的颜色。 本章介绍 Java Gnome 中的事件。