Yanıtlar:
Uygulamalarınızın tüm yerel uygulamalar gibi davranmasını sağlayan java-gnome (bir java gtk sarıcı) adlı bir kütüphane var . Onlara tüm ihtişamı sağlar: yerel widget'lar, küresel menü, vb.
Kütüphane ubuntu depolarında bulunur:
Kütüphanenin amacı zengin bir Java + Gnome deneyimi geliştirmektir. Bu kütüphaneyi kullanırsanız uygulamanızın Java'nın çoklu platform özelliğini kaybedeceğini unutmayın (çünkü java-gnome'a bağlı olacaktır).
Menü entegrasyonunu gösteren örnek bir uygulama (java-gnome ile birlikte gelir):
Ayatana'yı deneyin. Talimatları burada bulabilirsiniz: http://hanynowsky.wordpress.com/2012/05/12/integration-of-java-swing-applications-with-unity-global-menu-in-ubuntu-12-04/
Tek yapmanız gereken Java Ayatana Kütüphanesini içe aktarmak ve ana JFrame sınıfınızda çağırmaktır. Bu aslında kodunuza aşağıdaki birkaç satırın eklenmesini (Ayatana sınıflarını içe aktarmanın yanı sıra) ima eder:
if (AyatanaDesktop.isSupported())
ApplicationMenu.tryInstall(mainFrame);
İşte bir örnek:
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();
}
}
Ve en önemli şey, uygulamanızın hala çapraz platform olmasıdır. Yukarıdaki örneği hem Ubuntu 12.04 LTS hem de Windows XP'de test ettim.
Bir ppa kullanabilirsiniz: ppa: danjaredg / jayatana
http://www.webupd8.org/2014/02/get-unity-global-menu-hud-support-for.html
Bu normalde araç seti düzeyinde yapılır, örneğin GTK veya Qt. Yani bunu yapmanın amaçlanan yolu, eğer kullandığınız GUI araç takımı ise Swing'i düzeltmek olacaktır. Bununla birlikte, tüm Unity bileşenleri DBus kullanarak iletişim kurar, bu yüzden gerçekten isterseniz, DBus API'sını kendiniz uygulayarak kendiniz yapabilirsiniz. Bunu yapmak istiyorsanız, libdbusmenu'ya bir göz atmak ve nasıl çalıştığını görmek isteyebilirsiniz.
Sizin için bir düzeltme değil, ama FYI: Swing menülerinin (yarı) otomatik olarak genel menüye entegre olmadığını izlemek için Ubuntu hatasını # 984916 dosyaladım .