¿Cómo hago que mi aplicación Java sea compatible con el menú global de la unidad?

Respuestas:

8

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ú:

Aplicación de ejemplo

Marcos Roriz Junior
fuente
¿Has confirmado que libjava-gnome es compatible con libdbusmenu? La unidad no es Gnomo, después de todo. Además, creo que cambiar a otro kit de herramientas GUI solo para usar un servicio dbus es bastante radical.
Jo-Erlend Schinstad
Sí, lo he confirmado :).
Marcos Roriz Junior
2

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.

Diok
fuente
0

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.

Jo-Erlend Schinstad
fuente
-1 por no una respuesta real y por pedirle a la operadora que implemente el material dbus.
Marcos Roriz Junior
1
¿No es una respuesta real? Cómo puedes decir eso? Respondí exactamente lo que se le preguntó. El OP no preguntó cómo portar una aplicación Swing a GTK.
Jo-Erlend Schinstad
0

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.

Jesse Glick
fuente