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

在 Java Gnome 编程教程的这一部分中,我们将讨论事件。

Java Gnome 库是事件驱动的系统。 所有 GUI 应用都是事件驱动的。 应用启动一个主循环,该循环不断检查新生成的事件。 如果没有事件,则应用将等待并且不执行任何操作。

简单事件示例

下一个示例显示了我们如何应对两个基本事件。

quitbutton.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Button;
  4. import org.gnome.gtk.Fixed;
  5. import org.gnome.gtk.Gtk;
  6. import org.gnome.gtk.Widget;
  7. import org.gnome.gtk.Window;
  8. import org.gnome.gtk.WindowPosition;
  9. /**
  10. * Java Gnome tutorial
  11. *
  12. * This program demonstrates two
  13. * basic events.
  14. *
  15. * @author jan bodnar
  16. * website zetcode.com
  17. * last modified March 2009
  18. */
  19. public class GButton extends Window {
  20. public GButton() {
  21. setTitle("Button");
  22. initUI();
  23. setPosition(WindowPosition.CENTER);
  24. showAll();
  25. }
  26. public void initUI() {
  27. connect(new Window.DeleteEvent() {
  28. public boolean onDeleteEvent(Widget source, Event event) {
  29. Gtk.mainQuit();
  30. return false;
  31. }
  32. });
  33. Fixed fixed = new Fixed();
  34. Button quit = new Button("Quit");
  35. quit.connect(new Button.Clicked() {
  36. public void onClicked(Button button) {
  37. Gtk.mainQuit();
  38. }
  39. });
  40. quit.setSizeRequest(80, 35);
  41. fixed.put(quit, 50, 50);
  42. add(fixed);
  43. setSizeRequest(250, 200);
  44. }
  45. public static void main(String[] args) {
  46. Gtk.init(args);
  47. new GButton();
  48. Gtk.main();
  49. }
  50. }

在我们的代码示例中,我们对两个事件做出反应。 删除事件和单击事件。 当我们关闭窗口时,将触发删除事件。 默认情况下,该窗口被销毁,但应用不退出。 我们必须明确退出该程序。

  1. connect(new Window.DeleteEvent() {
  2. public boolean onDeleteEvent(Widget source, Event event) {
  3. Gtk.mainQuit();
  4. return false;
  5. }
  6. });

如果单击窗口的关闭按钮,则窗口将被破坏。 但是应用并未完全销毁。 我们必须调用Gtk.mainQuit()结束应用。 我们使用connect()方法将回调方法连接到特定事件类型。 在我们的例子中是DeleteEvent

  1. quit.connect(new Button.Clicked() {
  2. public void onClicked(Button button) {
  3. Gtk.mainQuit();
  4. }
  5. });

当我们单击按钮小部件时,将触发onClicked()方法。 我们对按钮单击做出反应,退出了应用。

移动窗口

下一个示例显示了我们如何对移动窗口事件做出反应。 我们在标题栏中显示窗口左上角的当前位置。

move.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gdk.EventConfigure;
  4. import org.gnome.gtk.Gtk;
  5. import org.gnome.gtk.Widget;
  6. import org.gnome.gtk.Window;
  7. import org.gnome.gtk.WindowPosition;
  8. /**
  9. * ZetCode Java Gnome tutorial
  10. *
  11. * This program demonstrates the
  12. * configure event.
  13. *
  14. * @author jan bodnar
  15. * website zetcode.com
  16. * last modified March 2009
  17. */
  18. public class GMoveWindow extends Window
  19. implements Window.ConfigureEvent {
  20. public GMoveWindow() {
  21. connect(new Window.DeleteEvent() {
  22. public boolean onDeleteEvent(Widget source, Event event) {
  23. Gtk.mainQuit();
  24. return false;
  25. }
  26. });
  27. connect(this);
  28. setPosition(WindowPosition.CENTER);
  29. setTitle("");
  30. resize(250, 200);
  31. showAll();
  32. }
  33. public boolean onConfigureEvent(Widget widget,
  34. EventConfigure eventConfigure) {
  35. int x = eventConfigure.getX();
  36. int y = eventConfigure.getY();
  37. setTitle(x + ", " + y);
  38. return false;
  39. }
  40. public static void main(String[] args) {
  41. Gtk.init(args);
  42. new GMoveWindow();
  43. Gtk.main();
  44. }
  45. }

调整大小和移动窗口最终导致创建ConfigureEvent

  1. public boolean onConfigureEvent(Widget widget,
  2. EventConfigure eventConfigure) {
  3. int x = eventConfigure.getX();
  4. int y = eventConfigure.getY();
  5. setTitle(x + ", " + y);
  6. return false;
  7. }

我们将窗口的 x,y 坐标设置为窗口的标题栏。

Java Gnome 中的事件 - 图1

图:移动事件

EnterNotifyEvent

当我们使用鼠标指针进入小部件的区域时,会发出EnterNotifyEvent

enter.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Color;
  3. import org.gnome.gdk.Event;
  4. import org.gnome.gdk.EventCrossing;
  5. import org.gnome.gtk.Button;
  6. import org.gnome.gtk.Fixed;
  7. import org.gnome.gtk.Gtk;
  8. import org.gnome.gtk.StateType;
  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
  16. * EnterNotifyEvent.
  17. *
  18. * @author jan bodnar
  19. * website zetcode.com
  20. * last modified March 2009
  21. */
  22. public class GEnterNotifyEvent extends Window {
  23. private Color lightGray = new Color(55000, 55000, 55000);
  24. public GEnterNotifyEvent() {
  25. setTitle("EnterNotifyEvent");
  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, 150);
  34. setPosition(WindowPosition.CENTER);
  35. showAll();
  36. }
  37. public void initUI() {
  38. Button button = new Button("Button");
  39. button.setSizeRequest(80, 30);
  40. button.connect(new Button.EnterNotifyEvent() {
  41. public boolean onEnterNotifyEvent(Widget widget,
  42. EventCrossing eventCrossing) {
  43. widget.modifyBackground(StateType.PRELIGHT, lightGray);
  44. return false;
  45. }
  46. });
  47. Fixed fix = new Fixed();
  48. fix.put(button, 20, 20);
  49. add(fix);
  50. }
  51. public static void main(String[] args) {
  52. Gtk.init(args);
  53. new GEnterNotifyEvent();
  54. Gtk.main();
  55. }
  56. }

一旦将鼠标指针悬停在按钮小部件上,我们将更改其背景颜色。

  1. button.connect(new Button.EnterNotifyEvent() {
  2. public boolean onEnterNotifyEvent(Widget widget,
  3. EventCrossing eventCrossing) {
  4. widget.modifyBackground(StateType.PRELIGHT, lightGray);
  5. return false;
  6. }
  7. });

在这里,我们对EnterNotifyEvent做出反应。

  1. widget.modifyBackground(StateType.PRELIGHT, lightGray);

我们修改按钮背景的颜色。

本章介绍 Java Gnome 中的事件。