Jak mogę dostosować moją aplikację Java do globalnego menu Unity?


Odpowiedzi:


8

Istnieje biblioteka o nazwie java-gnome (otoki java gtk), która pozwala twoim aplikacjom zachowywać się jak wszystkie aplikacje natywne. Zapewnia im całą chwałę: natywne widżety, globalne menu itp.

Biblioteka jest dostępna w repozytoriach ubuntu:

Celem biblioteki jest stworzenie bogatego środowiska Java + Gnome. Uwaga: jeśli użyjesz tej biblioteki, Twoja aplikacja utraci wieloplatformową funkcję Java (ponieważ będzie powiązana z java-gnome).

Oto przykładowa aplikacja (dostarczana z java-gnome) wyświetlająca integrację menu:

Przykładowa aplikacja


Czy potwierdziłeś, że libjava-gnome w ogóle obsługuje libdbusmenu? W końcu jedność nie jest gnomem. Myślę też, że przejście na inny zestaw GUI tylko po to, aby skorzystać z usługi dbus, aby być dość radykalnym.
Jo-Erlend Schinstad

Tak, potwierdziłem :).
Marcos Roriz Junior

2

Wypróbuj Ayatana. Instrukcje można znaleźć tutaj: http://hanynowsky.wordpress.com/2012/05/12/integration-of-java-swing-applications-with-unity-global-menu-in-ubuntu-12-04/

Wystarczy zaimportować bibliotekę Java Ayatana i wywołać ją w głównej klasie JFrame. W rzeczywistości oznacza to dodanie następujących kilku wierszy w kodzie (a także import klas Ayatana):

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

Oto przykład:

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

Najważniejsze jest to, że Twoja aplikacja jest nadal wieloplatformowa. Testowałem powyższy przykład zarówno w Ubuntu 12.04 LTS, jak i Windows XP.



0

Zwykle odbywa się to na poziomie zestawu narzędzi, na przykład w GTK lub Qt. Tak więc zamierzonym sposobem jest załatanie Swinga, jeśli używasz tego zestawu narzędzi GUI. Jednak wszystkie komponenty Unity komunikują się za pomocą DBus, więc jeśli naprawdę chcesz, możesz to zrobić samodzielnie, implementując API DBus. Jeśli chcesz to zrobić, możesz rzucić okiem na libdbusmenu i zobaczyć, jak to działa.


-1 za nie prawdziwą odpowiedź i za poproszenie operatora o implementację rzeczy dbus.
Marcos Roriz Junior

1
Nie jest to prawdziwa odpowiedź? Jak możesz tak mówić? Odpowiedziałem dokładnie na to pytanie. OP nie zapytał, jak przenieść aplikację Swing do GTK.
Jo-Erlend Schinstad

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.