Comment rendre mon application Java compatible avec le menu global Unity?

11

J'aime développer en Java mais souhaite également une compatibilité avec le menu global? Y a-t-il un moyen? Veuillez aider.

Ayush
la source

Réponses:

8

Il existe une bibliothèque appelée java-gnome (un wrapper java gtk) qui permet à vos applications de se comporter comme toutes les applications natives. Il leur donne toute la gloire: widgets natifs, menu global, etc.

La bibliothèque est disponible sur les référentiels ubuntu:

L'objectif de la bibliothèque est de développer une riche expérience Java + Gnome. Attention, si vous utilisez cette bibliothèque, votre application perdra la fonctionnalité multiplateforme de Java (car elle sera liée à java-gnome).

Voici un exemple d'application (fournie avec java-gnome) affichant l'intégration du menu:

Exemple d'application

Marcos Roriz Junior
la source
Avez-vous confirmé que libjava-gnome prend en charge libdbusmenu? L'unité n'est pas Gnome, après tout. De plus, je pense que le passage à une autre boîte à outils GUI juste pour utiliser un service dbus est assez radical.
Jo-Erlend Schinstad
Oui, je l'ai confirmé :).
Marcos Roriz Junior
2

Essayez l'Ayatana. Vous pouvez trouver des instructions ici: http://hanynowsky.wordpress.com/2012/05/12/integration-of-java-swing-applications-with-unity-global-menu-in-ubuntu-12-04/

Tout ce que vous avez à faire est d'importer la bibliothèque Java Ayatana et de l'appeler dans votre classe JFrame principale. Cela implique en fait l'ajout des deux lignes suivantes dans votre code (ainsi que l'importation de classes Ayatana):

if (AyatanaDesktop.isSupported())
      ApplicationMenu.tryInstall(mainFrame);

Voici un exemple:

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import org.java.ayatana.ApplicationMenu;
import org.java.ayatana.AyatanaDesktop;
public class MyAppWithUnityMenu {
public MyAppWithUnityMenu () {
    JFrame mainFrame = new JFrame("This app integrates in Unity menu bar");
// set up mainFrame, by adding components, etc.
    JPanel panel = new JPanel();
    panel.add(new JLabel("This is a sample application for testing menu integration in Unity. Enjoy!"));
    mainFrame.getContentPane().add(panel);     
    mainFrame.addWindowListener ( new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
          System.exit(0);
        }
    });
 // set up the menu bar, by adding menus, etc.
  JMenuBar menuBar = new JMenuBar();
  JMenu file = new JMenu("File");
  file.add(new JMenuItem("Open"));
  file.add(new JMenuItem("Save"));
  file.add(new JMenuItem("Close"));
  JMenu edit = new JMenu("Edit");
  edit.add(new JMenuItem("Copy"));
  edit.add(new JMenuItem("Cut"));
  edit.add(new JMenuItem("Paste"));
  JMenu help = new JMenu("Help");
  help.add(new JMenuItem("Help topics"));
  help.add(new JMenuItem("About"));
  menuBar.add(file);
  menuBar.add(edit);
  menuBar.add(help);
  menuBar.setVisible(true);
  mainFrame.setJMenuBar(menuBar);
  mainFrame.pack();
  mainFrame.setVisible(true);
   // Java Ayatana Call
  if (AyatanaDesktop.isSupported()) { 
      ApplicationMenu.tryInstall(mainFrame);
  }
}
public static void main(String[] args) {
    new MyAppWithUnityMenu();
}
}

Et le plus important est que votre application soit toujours multiplateforme. J'ai testé l'exemple ci-dessus dans Ubuntu 12.04 LTS et Windows XP.

Diok
la source
0

Cela se fait normalement au niveau de la boîte à outils, par exemple dans GTK ou Qt. Donc, la manière prévue de le faire serait de patcher Swing, si c'est la boîte à outils GUI que vous utilisez. Cependant, tous les composants Unity communiquent à l'aide de DBus, donc si vous le vouliez vraiment, vous pouvez le faire vous-même en implémentant vous-même l'API DBus. Si vous voulez faire cela, vous voudrez peut-être jeter un œil à libdbusmenu et voir comment cela fonctionne.

Jo-Erlend Schinstad
la source
-1 pour pas une vraie réponse et pour avoir demandé l'op pour implémenter le truc dbus.
Marcos Roriz Junior
1
Pas une vraie réponse? Comment peux-tu dire ça? J'ai répondu précisément à ce qui avait été demandé. L'OP n'a pas demandé comment porter une application Swing sur GTK.
Jo-Erlend Schinstad
0

Pas une solution pour vous, mais pour info: j'ai déposé le bogue Ubuntu # 984916 pour suivre le fait que les menus Swing ne sont pas (semi-) automatiquement intégrés dans le menu global.

Jesse Glick
la source