如何在Java Gnome/GTK程序中使用Glade UI(.glade文件)?

4
我在互联网上做了一些研究,寻找教程/文档,以便告诉我如何在Java Gnome项目中使用Glade设计的UI,但没有找到。我已经知道如何使用Java Gnome/GTK从代码中创建UI。无论如何,我想在Java Gnome/Gtk项目中使用我创建的Glade UI,但我不知道从哪里开始。请告诉我:
  • 我需要安装哪些软件包;
  • 如何将我创建的Glade UI(.glade文件)与我的Java Gnome/Gtk项目集成(特别是在Eclipse中);
  • 并提供一个示例。

先谢谢您的帮助。

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

enter image description here

这是上面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"></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"></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>

我不明白这个问题。你所说的“使用Glade UI”是什么意思?“Java Gnome项目”又是什么? - Code-Apprentice
Glade UI = 是我构建的用户界面(在打印屏幕/截图中显示的界面)。Java Gnome = 是Java的Gtk绑定 - Zignd
你是如何创建这个 Glade UI 的?界面背后是否有代码?它全部都是“拖放”设计吗? - Code-Apprentice
@Code-Guru 首先,您可以使用“拖放”功能创建并保存文件,但是如果您在文本编辑器中打开该文件,您将看到代表它的XML代码。我会在问题中添加UI代码。 - Zignd
2个回答

3

好的,你需要做以下事情:

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

我假设你已经在Linux系统中安装了java-gnome库,并在eclipse项目中导入了jar包(项目属性- java构建路径 - 添加外部jar - /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: Invalid object type `GtkLabel'

错误是关于树中的第一个元素。 经过深入研究,我发现由于一个已知但未修复的bug,你需要在使用每个小部件之前预定义它:在这种情况下只需调用
 new Label();

在创建构建器之前。

显然,这种方法是不可行的,将在未来得到修复。

更多关于此问题的信息:

java-gnome-developer邮件列表上的讨论

Java-gnome-hackers邮件列表上的讨论

希望这可以帮助……


3

您应该使用Builder类(自java-gnome 4.0.20起可用)。创建它,调用addFromFile方法将您的glade文件传递给它。然后只需使用在Glade UI中输入的对象名称调用getObject以获取该对象。我认为唯一缺少的是信号连接部分。原始的GtkBuilder类(用于C语言)提供了更多功能,尤其是信号连接功能(例如gtk_builder_connect_signals)。因此,如果这些功能在Java绑定中不可用,则可能需要手动连接信号。这意味着在glade中在“信号”选项卡中设置要连接的信号,并设置此信号将调用的回调函数的名称。您可以通过查看Python中的操作方式来猜测基本操作:

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

只需在网上搜索“glade教程”或“glade gtkbuilder”,即可找到其他资料。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接