Réponses:
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:
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.
Vous pouvez utiliser un ppa: ppa: danjaredg / jayatana
http://www.webupd8.org/2014/02/get-unity-global-menu-hud-support-for.html
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.