Respuestas:
Hay una biblioteca llamada java-gnome (un contenedor java gtk) que permite que sus aplicaciones se comporten como todas las aplicaciones nativas. Les proporciona toda la gloria: widgets nativos, menú global, etc.
La biblioteca está disponible en los repositorios de ubuntu:
El objetivo de la biblioteca es desarrollar una rica experiencia Java + Gnome. Tenga en cuenta que si usa esta biblioteca, su aplicación perderá la función multiplataforma de Java (ya que estará vinculada a java-gnome).
Aquí hay una aplicación de muestra (que viene con java-gnome) que muestra la integración del menú:
Prueba Ayatana. Puede encontrar instrucciones aquí: http://hanynowsky.wordpress.com/2012/05/12/integration-of-java-swing-applications-with-unity-global-menu-in-ubuntu-12-04/
Todo lo que tiene que hacer es importar la Biblioteca Java Ayatana y llamarla en su clase JFrame principal. Esto realmente implica la adición de las siguientes dos líneas en su código (así como la importación de clases de Ayatana):
if (AyatanaDesktop.isSupported())
ApplicationMenu.tryInstall(mainFrame);
Aquí hay un ejemplo:
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();
}
}
Y lo más importante es que su aplicación aún es multiplataforma. He probado el ejemplo anterior en Ubuntu 12.04 LTS y Windows XP.
Puedes usar un ppa: ppa: danjaredg / jayatana
http://www.webupd8.org/2014/02/get-unity-global-menu-hud-support-for.html
Eso normalmente se hace a nivel de kit de herramientas, por ejemplo en GTK o Qt. Entonces, la forma prevista de hacerlo sería parchear Swing, si ese es el kit de herramientas GUI que está utilizando. Sin embargo, todos los componentes de Unity se comunican usando DBus, por lo que si realmente lo desea, puede hacerlo usted mismo implementando la API DBus usted mismo. Si desea hacer esto, puede echar un vistazo a libdbusmenu y ver cómo funciona.
No es una solución para ti, pero para tu información: archivé el error de Ubuntu # 984916 para rastrear el hecho de que los menús Swing no están (semi) integrados automáticamente en el menú global.