Câu trả lời:
Có một thư viện gọi là java-gnome (trình bao bọc java gtk) cho phép các ứng dụng của bạn hoạt động giống như tất cả các ứng dụng gốc. Nó cung cấp tất cả vinh quang cho họ: widget gốc, menu toàn cầu, v.v.
Thư viện có sẵn trên kho ubfox:
Mục tiêu của thư viện là phát triển trải nghiệm Java + Gnome phong phú. Coi chừng, nếu bạn sử dụng thư viện này, ứng dụng của bạn sẽ mất tính năng đa nền tảng của Java (vì nó sẽ được gắn với java-gnome).
Đây là một ứng dụng mẫu (đi kèm với java-gnome) hiển thị tích hợp menu:
Hãy thử Ayatana. Bạn có thể tìm thấy hướng dẫn tại đây: http://hanynowsky.wordpress.com/2012/05/12/integration-of-java-swing-appluggest-with-unity-global-menu-in-ubfox-12-04/
Tất cả những gì bạn phải làm là nhập Thư viện Java Ayatana và gọi nó trong lớp JFrame chính của bạn. Điều này thực sự ngụ ý việc thêm một vài dòng sau vào mã của bạn (cũng như nhập các lớp Ayatana):
if (AyatanaDesktop.isSupported())
ApplicationMenu.tryInstall(mainFrame);
Đây là một ví dụ:
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();
}
}
Và điều quan trọng nhất là ứng dụng của bạn vẫn đa nền tảng. Tôi đã thử nghiệm ví dụ trên trong cả Ubuntu 12.04 LTS và Windows XP.
Bạn có thể sử dụng một ppa: ppa: danjaredg / jayatana
http://www.webupd8.org/2014/02/get-unity-global-menu-hud-support-for.html
Điều đó thường được thực hiện ở cấp bộ công cụ, ví dụ như trong GTK hoặc Qt. Vì vậy, cách dự định để làm điều đó là vá lỗi Swing, nếu đó là bộ công cụ GUI bạn đang sử dụng. Tuy nhiên, tất cả các thành phần Unity giao tiếp bằng DBus, vì vậy nếu bạn thực sự muốn, bạn có thể tự làm điều đó bằng cách tự thực hiện API DBus. Nếu bạn muốn làm điều này, bạn có thể muốn xem libdbusmenu và xem nó hoạt động như thế nào.