4

I've did a research on the Internet looking for tutorials/documentations to explain me how to use a UI designed in Glade in a Java Gnome project, but no luck. I already know how to create a UI from the code using the Java Gnome/GTK. Anyway, I'd like to use a Glade UI that I've created in a Java Gnome/Gtk project, but I have no idea from where to start. Please tell me:

  • which packages I need to install;

  • how to integrate the UI I've create with Glade (the .glade file) with my Java Gnome/Gtk project (specifically in Eclipse);

  • and give an example.

Thanks in advance.

That's how my Glade UI looks (Just click the image to see it bigger):

enter image description here

This is the XML code of the UI above:

<?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>
Zignd
  • 6,896
  • 12
  • 40
  • 62
  • I don't understand the question. What do you mean by "use a Glade UI"? And what is "a Java Gnome project"? – Code-Apprentice Jan 13 '13 at 20:50
  • Glade UI = is the user interface that I built (the one that I show in the printscreen/screenshot). Java Gnome = is the [Gtk binding for Java](http://www.gtk.org/language-bindings.php) – Zignd Jan 13 '13 at 21:12
  • How did you create this Glade UI? Is there code behind the interface? Is it all "drag-and-drop" design? – Code-Apprentice Jan 13 '13 at 21:39
  • @Code-Guru Both, first you create it with "drag-and-drop" and save the file, but if you open the file in a text editor you'll see a XML code the represents it. Will add the UI code in the question. – Zignd Jan 13 '13 at 21:44

2 Answers2

3

You're supposed to use the Builder class (available since java-gnome 4.0.20). Create it, call the addFromFile method to give it your glade file. Then just call getObject with the name of the object as entered in the Glade UI to get that object. The only thing I see as missing is the signal connection stuff. The original GtkBuilder class (in C) provides much more, especially signals connection features (gtk_builder_connect_signals for example). So you may need to connect signals by hand if these features are not available in the Java bindings. This means setting in glade in the "signals" tab the signal you want to connect, and setting the name of the callback this signal will call. You can have a good guess of the basics by seeing how it's done in python:

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

Just browse the web for "glade tutorial" or "glade gtkbuilder" for the rest.

liberforce
  • 11,189
  • 37
  • 48
3

Ok, you need to:

  • Init GTK library
  • Create a Builder object
  • Retrieve the window widget
  • Display the window widget

I assume you have already installed the java-gnome library in your Linux system and imported the jar in your eclipse project (project properties - java build path - add external jars - /usr/share/java/gtk.jar).

A sample code:

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();

This is the way it should work. If you want to set a listener on an object, e.g. a button, you retrieve the oject by name as seen before with the window and then:

button.connect(new Clicked() {

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

Is it working for you? Well, it's not for me. The problem was my code was throwing an exception when calling Builder.addFromFile(filename)

java.text.ParseException: Invalid object type `GtkLabel'

The error is about the first element in the tree. After a deep research I found that, due to a known bug never fixed, you need to pre-define every widget before using it: in this case just call

 new Label();

before creating the builder.

This is, obviously, not intended to work in this way, and will be fixed in the future.

More info on this issue:

Thread on java-gnome-developer mailing list

Thread on Java-gnome-hackers mailing list

Hope this can help...

penguin86
  • 109
  • 7