Wie mache ich meine Java-App mit dem globalen Unity-Menü kompatibel?

11

Ich entwickle gerne in Java, möchte aber auch Kompatibilität mit dem globalen Menü? Gibt es einen Weg? Bitte helfen Sie.

Ayush
quelle

Antworten:

8

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:

Beispiel App

Marcos Roriz Junior
quelle
Haben Sie bestätigt, dass libjava-gnome libdbusmenu überhaupt unterstützt? Einheit ist schließlich kein Gnom. Ich denke auch, dass der Wechsel zu einem anderen GUI-Toolkit, nur um einen dbus-Dienst zu nutzen, ziemlich radikal ist.
Jo-Erlend Schinstad
Ja, ich habe bestätigt :).
Marcos Roriz Junior
2

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.

Diok
quelle
0

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.

Jo-Erlend Schinstad
quelle
-1 für keine echte Antwort und für die Aufforderung an die Operation, das dbus-Zeug zu implementieren.
Marcos Roriz Junior
1
Keine echte Antwort? Wie kannst du das sagen? Ich antwortete genau, was gefragt wurde. Das OP fragte nicht, wie eine Swing-Anwendung auf GTK portiert werden soll.
Jo-Erlend Schinstad