Come posso rendere la mia app java compatibile con il menu globale unity?


Risposte:


8

Esiste una libreria chiamata java-gnome (un wrapper java gtk) che consente alle tue app di comportarsi come tutte le app native. Fornisce loro tutta la gloria: widget nativi, menu globale, ecc.

La libreria è disponibile sui repository ubuntu:

L'obiettivo della libreria è sviluppare una ricca esperienza Java + Gnome. Attenzione, se usi questa libreria la tua app perderà la funzionalità multipiattaforma di Java (poiché sarà legata a java-gnome).

Ecco un'app di esempio (fornita con java-gnome) che mostra l'integrazione del menu:

App di esempio


Hai confermato che libjava-gnome supporta affatto libdbusmenu? L'unità non è Gnome, dopo tutto. Inoltre, penso che passare a un altro toolkit GUI solo per utilizzare un servizio dbus sia abbastanza radicale.
Jo-Erlend Schinstad,

Sì, ho confermato :).
Marcos Roriz Junior,

2

Prova l'Ayatana. Puoi trovare le istruzioni qui: http://hanynowsky.wordpress.com/2012/05/12/integration-of-java-swing-applications-with-unity-global-menu-in-ubuntu-12-04/

Tutto quello che devi fare è importare la libreria Ayatana Java e chiamarla nella tua classe JFrame principale. Ciò implica effettivamente l'aggiunta delle seguenti due righe nel codice (nonché l'importazione delle classi Ayatana):

if (AyatanaDesktop.isSupported())
      ApplicationMenu.tryInstall(mainFrame);

Ecco un esempio:

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();
}
}

E la cosa più importante è che l'applicazione sia ancora multipiattaforma. Ho testato l'esempio sopra in Ubuntu 12.04 LTS e Windows XP.



0

Ciò avviene normalmente a livello di toolkit, ad esempio in GTK o Qt. Quindi il modo previsto per farlo sarebbe patch Swing, se questo è il toolkit GUI che stai usando. Tuttavia, tutti i componenti Unity comunicano tramite DBus, quindi se lo desideri davvero, puoi farlo tu stesso implementando l'API DBus. Se vuoi farlo, potresti dare un'occhiata a libdbusmenu e vedere come funziona.


-1 per non una vera risposta e per aver chiesto all'op di implementare la roba dbus.
Marcos Roriz Junior,

1
Non è una vera risposta? Come puoi dirlo? Ho risposto esattamente a ciò che è stato chiesto. L'OP non ha chiesto come effettuare il porting di un'applicazione Swing su GTK.
Jo-Erlend Schinstad,

0

Non una soluzione per te, ma FYI: ho archiviato il bug # 984916 di Ubuntu per tenere traccia del fatto che i menu Swing non sono (semi) automaticamente integrati nel menu globale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.