Antworten:
Es gibt eine Bibliothek namens Java-Gnome (ein Java-GTK-Wrapper), mit der sich Ihre Apps wie alle nativen Apps verhalten können. Es bietet ihnen den ganzen Ruhm: native Widgets, globales Menü usw.
Die Bibliothek ist in den Ubuntu-Repositories verfügbar:
Das Ziel der Bibliothek ist es, ein reichhaltiges Java + Gnome-Erlebnis zu entwickeln. Beachten Sie, dass Ihre App bei Verwendung dieser Bibliothek die Multiplattform-Funktion von Java verliert (da sie an Java-Gnome gebunden ist).
Hier ist eine Beispiel-App (die mit Java-Gnome geliefert wird), die die Menüintegration anzeigt:
Versuchen Sie es mit Ayatana. Anweisungen finden Sie hier: http://hanynowsky.wordpress.com/2012/05/12/integration-of-java-swing-applications-with-unity-global-menu-in-ubuntu-12-04/
Sie müssen lediglich die Java Ayatana Library importieren und in Ihrer Haupt-JFrame-Klasse aufrufen. Dies impliziert tatsächlich das Hinzufügen der folgenden Zeilen in Ihrem Code (sowie das Importieren von Ayatana-Klassen):
if (AyatanaDesktop.isSupported())
ApplicationMenu.tryInstall(mainFrame);
Hier ist ein Beispiel:
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();
}
}
Und das Wichtigste ist, dass Ihre Anwendung immer noch plattformübergreifend ist. Ich habe das obige Beispiel sowohl in Ubuntu 12.04 LTS als auch in Windows XP getestet.
Sie können ein ppa: ppa: danjaredg / jayatana verwenden
http://www.webupd8.org/2014/02/get-unity-global-menu-hud-support-for.html
Dies geschieht normalerweise auf Toolkit-Ebene, beispielsweise in GTK oder Qt. Der beabsichtigte Weg, dies zu tun, wäre das Patchen von Swing, wenn dies das von Ihnen verwendete GUI-Toolkit ist. Alle Unity-Komponenten kommunizieren jedoch über DBus. Wenn Sie dies wirklich möchten, können Sie dies selbst tun, indem Sie die DBus-API selbst implementieren. Wenn Sie dies tun möchten, sollten Sie sich libdbusmenu ansehen und sehen, wie es funktioniert.
Keine Lösung für Sie, aber zu Ihrer Information : Ich habe den Ubuntu- Fehler # 984916 eingereicht , um die Tatsache zu verfolgen, dass Swing-Menüs nicht (halb-) automatisch in das globale Menü integriert werden.