Search code examples
javaubuntuuser-interfacegtkglade

How to use a Glade UI (.glade file) in a Java Gnome/GTK program?


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>

Solution

  • 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...