Как сделать мое Java-приложение совместимым с глобальным меню Unity?

Ответы:

8

Существует библиотека под названием java-gnome (оболочка java gtk), которая позволяет вашим приложениям вести себя как все нативные приложения. Он предоставляет им всю славу: родные виджеты, глобальное меню и т. Д.

Библиотека доступна в репозиториях Ubuntu:

Целью библиотеки является развитие богатого опыта Java + Gnome. Помните, что если вы используете эту библиотеку, ваше приложение утратит многоплатформенную функцию Java (поскольку она будет привязана к java-gnome).

Вот пример приложения (которое поставляется с java-gnome), отображающее интеграцию меню:

Пример приложения

Маркос Рорис Младший
источник
Вы подтвердили, что libjava-gnome вообще поддерживает libdbusmenu? В конце концов, единство - это не гном. Кроме того, я думаю, что переключение на другой инструментарий GUI только для того, чтобы использовать службу dbus, было довольно радикальным.
Джо-Эрленд Шинстад
Да, я подтвердил :).
Маркос Рорис Младший
2

Попробуйте аятана. Вы можете найти инструкции здесь: http://hanynowsky.wordpress.com/2012/05/12/integration-of-java-swing-applications-with-unity-global-menu-in-ubuntu-12-04/

Все, что вам нужно сделать, это импортировать библиотеку Java Ayatana и вызвать ее в своем основном классе JFrame. На самом деле это подразумевает добавление следующей пары строк в ваш код (а также импорт классов Ayatana):

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

Вот пример:

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

И самое главное, что ваше приложение все еще кроссплатформенное. Я протестировал приведенный выше пример как в Ubuntu 12.04 LTS, так и в Windows XP.

Diok
источник
0

Обычно это делается на уровне инструментария, например, в GTK или Qt. Таким образом, предполагаемый способ сделать это - установить патч на Swing, если вы используете GUI-инструментарий. Однако все компоненты Unity взаимодействуют с использованием DBus, поэтому, если вы действительно этого хотите, вы можете сделать это самостоятельно, реализовав API DBus самостоятельно. Если вы хотите сделать это, вы можете взглянуть на libdbusmenu и посмотреть, как это работает.

Джо-Эрленд Шинстад
источник
-1 за ненастоящий ответ и за то, что он попросил оператора реализовать материал dbus.
Маркос Рорис Младший
1
Не настоящий ответ? Как ты можешь говорить так? Я ответил точно, что спросили. ОП не спрашивал, как перенести приложение Swing на GTK.
Джо-Эрленд Шинстад
0

Не для вас, но к вашему сведению: я подал ошибку Ubuntu # 984916, чтобы отследить тот факт, что меню Swing не (частично) автоматически интегрируются в глобальное меню.

Джесси Глик
источник