Comment utiliser une interface utilisateur Glade (.fichier glade) dans un programme Java Gnome/GTK?


J'ai fait une recherche sur Internet à la recherche de tutoriels/documentations pour m'expliquer comment utiliser une interface utilisateur conçue dans Glade dans un projet Java Gnome, mais pas de chance. Je sais déjà comment créer une interface utilisateur à partir du code en utilisant Java Gnome/GTK. Quoi qu'il en soit, j'aimerais utiliser une interface utilisateur Glade que j'ai créée dans un projet Java Gnome/Gtk, mais je ne sais pas par où commencer. S'il vous plaît dites-moi:

  • Quels paquets j'ai besoin d'installer;

  • Comment intégrer l'interface utilisateur avec laquelle j'ai créé Glade (le .fichier glade) avec mon projet Java Gnome/Gtk (en particulier dans Eclipse);

  • Et donnez un exemple.

Merci d'avance.

Voilà à quoi ressemble mon interface utilisateur Glade (cliquez simplement sur l'image pour la voir plus grande):

entrez la description de l'image ici

C'est le code XML de l'interface utilisateur ci-dessus:

<?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>
Author: Zignd, 2013-01-14

2 answers

Ok, vous devez:

  • Init bibliothèque GTK
  • Créer un objet Constructeur
  • Récupérer le widget de fenêtre
  • Afficher le widget de fenêtre

Je suppose que vous avez déjà installé la bibliothèque java-gnome dans votre système Linux et importé le jar dans votre projet eclipse (propriétés du projet - java build path - add external jars - /usr/share/java/gtk.pot).

Un exemple de 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();

C'est ainsi que cela devrait fonctionner. Si vous souhaitez définir un écouteur sur un objet, par exemple un bouton, vous récupérez l'oject par nom comme vu précédemment avec la fenêtre puis:

button.connect(new Clicked() {

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

Cela fonctionne-t-il pour vous? Eh bien, ce n'est pas pour moi. Le problème était que mon code lançait une exception lors de l'appel de Builder.addFromFile (filename)

Java.texte.ParseException: Type d'objet non valide `GtkLabel'

L'erreur concerne le premier élément de l'arbre. Après une recherche approfondie, j'ai constaté que, en raison d'un bug connu jamais corrigé, vous devez pré-définir chaque widget avant de l'utiliser: dans ce cas, appelez simplement

 new Label();

Avant de créer le générateur.

Ceci est, évidemment, pas destiné à fonctionner de cette façon, et sera fixé dans le futur.

Plus d'informations sur cette question:

J'ai eu une discussion sur la liste de diffusion java-gnome-developer

J'ai besoin d'une liste de discussion sur Java-gnome-hackers

J'Espère que cela peut aider...

 3
Author: penguin86, 2014-03-31 19:20:41

, Vous êtes censé utiliser le Builder catégorie (disponible depuis java-gnome 4.0.20). Créez-le, appelez la méthode addFromFile pour lui donner votre fichier glade. Ensuite, appelez simplement getObject avec le nom de l'objet tel qu'il est entré dans l'interface utilisateur de Glade pour obtenir cet objet. La seule chose que je vois comme manquante est le truc de connexion de signal. La classe d'origine GtkBuilder (en C) fournit beaucoup plus, en particulier les fonctionnalités de connexion des signaux (gtk_builder_connect_signals par exemple). Vous devrez donc peut-être connecter les signaux à la main si ceux-ci les fonctionnalités ne sont pas disponibles dans les liaisons Java. Cela signifie définir dans glade dans l'onglet" signaux " le signal que vous souhaitez connecter, et définir le nom du rappel que ce signal appellera. Vous pouvez avoir une bonne idée des bases en voyant comment cela se fait en python:

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

Il suffit de parcourir le Web pour "glade tutorial" ou "glade gtkbuilder" pour le reste.

 3
Author: liberforce, 2013-01-15 10:42:49