4

我在 Internet 上进行了一项研究,寻找教程/文档来解释我如何在 Java Gnome 项目中使用 Glade 设计的 UI,但没有运气。我已经知道如何使用 Java Gnome/GTK 从代码创建 UI。无论如何,我想使用我在 Java Gnome/Gtk 项目中创建的 Glade UI,但我不知道从哪里开始。请告诉我:

  • 我需要安装哪些软件包;

  • 如何将我使用 Glade(.glade 文件)创建的 UI 与我的 Java Gnome/Gtk 项目(特别是在 Eclipse 中)集成;

  • 并举个例子。

提前致谢。

这就是我的 Glade UI 的外观(只需单击图像即可放大):

在此处输入图像描述

这是上面 UI 的 XML 代码:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="window_position">center</property>
    <child>
      <object class="GtkFixed" id="fixed1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkEntry" id="entry1">
            <property name="width_request">162</property>
            <property name="height_request">25</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="halign">start</property>
            <property name="valign">end</property>
            <property name="invisible_char">•&lt;/property>
          </object>
          <packing>
            <property name="x">11</property>
            <property name="y">49</property>
          </packing>
        </child>
        <child>
          <object class="GtkEntry" id="entry2">
            <property name="width_request">162</property>
            <property name="height_request">25</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="halign">start</property>
            <property name="valign">end</property>
            <property name="invisible_char">•&lt;/property>
            <property name="invisible_char_set">True</property>
          </object>
          <packing>
            <property name="x">271</property>
            <property name="y">49</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="label">
            <property name="height_request">25</property>
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">*</property>
          </object>
          <packing>
            <property name="x">216</property>
            <property name="y">49</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button">
            <property name="label" translatable="yes">Calculate!!!</property>
            <property name="use_action_appearance">False</property>
            <property name="width_request">84</property>
            <property name="height_request">27</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="use_action_appearance">False</property>
          </object>
          <packing>
            <property name="x">181</property>
            <property name="y">93</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>
4

2 回答 2

3

好的,您需要:

  • 初始化 GTK 库
  • 创建 Builder 对象
  • 检索窗口小部件
  • 显示窗口小部件

我假设您已经在 Linux 系统中安装了 java-gnome 库并在 eclipse 项目中导入了 jar(项目属性 - java 构建路径 - 添加外部 jars - /usr/share/java/gtk.jar)。

示例代码:

Gtk.init(args); //Init library
Builder b = new Builder();  //Create builder
b.addFromFile("filename.glade");  //Load layout from file
Window w = (Window) b.getObject("myWindowName");  //Retrieve an object
w.showAll(); //Show window
Gtk.main();

这是它应该工作的方式。如果你想在一个对象上设置一个监听器,例如一个按钮,你可以通过之前在窗口中看到的名称来检索对象,然后:

button.connect(new Clicked() {

    @Override
    public void onClicked(Button arg0) {
        // Do what you want
    }
});

它对你有用吗?好吧,这不适合我。问题是我的代码在调用 Builder.addFromFile(filename) 时抛出异常

java.text.ParseException:无效的对象类型`GtkLabel'

错误与树中的第一个元素有关。经过深入研究,我发现,由于一个已知的错误从未修复,您需要在使用之前预先定义每个小部件:在这种情况下,只需调用

 new Label();

在创建构建器之前。

这显然打算以这种方式工作,并将在未来修复。

关于这个问题的更多信息:

java-gnome-developer 邮件列表上的线程

Java-gnome-hackers 邮件列表上的主题

希望这可以帮助...

于 2014-03-27T11:50:13.070 回答
3

您应该使用Builder该类(自 java-gnome 4.0.20 起可用)。创建它,调用addFromFile方法给它你的 glade 文件。然后只需调用getObject在 Glade UI 中输入的对象名称即可获取该对象。我认为唯一缺少的是信号连接的东西。原始的GtkBuilder类(在 C 中)提供了更多,尤其是信号连接功能(gtk_builder_connect_signals例如)。因此,如果这些功能在 Java 绑定中不可用,您可能需要手动连接信号。这意味着在“信号”选项卡中设置您要连接的信号,并设置此信号将调用的回调的名称。通过查看它在 python 中是如何完成的,您可以很好地猜测基础知识:

http://python-gtk-3-tutorial.readthedocs.org/en/latest/builder.html

只需在网上浏览“glade 教程”或“glade gtkbuilder”即可。

于 2013-01-15T10:42:49.513 回答