如何使我的Java应用程序与unity全局菜单兼容?


Answers:


8

有一个名为java-gnome(java gtk包装器)的库,该库可使您的应用程序像所有本机应用程序一样运行。它为他们提供了所有荣耀:本机小部件,全局菜单等。

该库位于ubuntu存储库中:

该库的目标是开发丰富的Java + Gnome经验。请注意,如果您使用此库,您的应用程序将失去Java的多平台功能(因为它将与java-gnome绑定在一起)。

这是一个显示菜单集成的示例应用程序(java-gnome附带):

示例应用


您是否已确认libjava-gnome完全支持libdbusmenu?毕竟,团结不是侏儒。另外,我认为仅为了使用dbus服务而切换到另一个GUI工具箱就相当激进了。
Jo-Erlend Schinstad

是的,我已经确认:)。
马科斯·罗里斯

2

尝试Ayatana。您可以在此处找到说明: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中测试了上面的示例。



0

这通常是在工具包级别完成的,例如在GTK或Qt中。因此,如果您使用的是GUI工具包,那么实现此目标的方法将是修补Swing。但是,所有Unity组件都使用DBus进行通信,因此,如果您确实需要,可以自己实现DBus API来自己做。如果要执行此操作,则可能需要查看libdbusmenu并查看其工作方式。


-1不是一个真正的答案,而是要求op实施dbus的东西。
马科斯·罗里斯

1
不是一个真正的答案?你怎么能这么说?我确切地回答了要求。OP并没有询问如何将Swing应用程序移植到GTK。
2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.