ฉันจะทำให้แอป java ของฉันเข้ากันได้กับเมนูทั่วโลกของความสามัคคีได้อย่างไร


11

ฉันชอบที่จะพัฒนาใน Java แต่ยังต้องการความเข้ากันได้กับเมนูทั่วโลก? มีวิธีหรือไม่? กรุณาช่วย.

คำตอบ:


8

มีไลบรารีชื่อjava-gnome (ตัวห่อ gtk java) ที่ช่วยให้แอปของคุณทำงานเหมือนแอพทั่วไปทั้งหมด มันมอบความรุ่งโรจน์ทั้งหมดให้กับพวกเขา: เครื่องมือพื้นเมืองเมนูทั่วโลกและอื่น ๆ

ห้องสมุดมีอยู่ในที่เก็บอูบุนตู:

เป้าหมายของห้องสมุดคือการพัฒนาประสบการณ์ Java + Gnome ที่หลากหลาย ระวังว่าถ้าคุณใช้ไลบรารี่ของคุณแอปของคุณจะสูญเสียฟีเจอร์หลายแพลตฟอร์มของ Java (เนื่องจากมันจะเชื่อมโยงกับ java-gnome)

นี่คือแอปตัวอย่าง (ที่มาพร้อมกับ java-gnome) ที่แสดงการรวมเมนู:

แอพตัวอย่าง


คุณยืนยันแล้วว่า libjava-gnome รองรับ libdbusmenu หรือไม่? ความสามัคคีไม่ใช่ Gnome หลังจากทั้งหมด นอกจากนี้ฉันคิดว่าการเปลี่ยนไปใช้ชุดเครื่องมือ GUI อื่นเพื่อใช้บริการ dbus ค่อนข้างรุนแรง
Jo-Erlend Schinstad

ใช่ฉันยืนยันแล้ว :)
Marcos Rorizo ​​n จูเนียร์

2

ลอง Ayatana คุณสามารถดูคำแนะนำได้ที่นี่: http://hanynowsky.wordpress.com/2012/05/12/integration-of-java-swing-applications-with-unity-global-menu-in-ubuntu-12-04/

สิ่งที่คุณต้องทำคือนำเข้า Java Ayatana Library และเรียกมันในคลาส 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 ดังนั้นวิธีที่ตั้งใจจะทำคือแก้ไข Patch Swing ถ้าเป็นชุดเครื่องมือ GUI ที่คุณใช้ อย่างไรก็ตามคอมโพเนนต์ Unity ทั้งหมดสื่อสารโดยใช้ DBus ดังนั้นหากคุณต้องการจริงๆคุณสามารถทำได้ด้วยตัวเองโดยใช้ DBus API ด้วยตัวคุณเอง หากคุณต้องการทำสิ่งนี้คุณอาจต้องการดู libdbusmenu และดูว่ามันทำงานอย่างไร


-1 ไม่ใช่คำตอบที่แท้จริงและขอให้ผู้ใช้ใช้สิ่ง dbus
Marcos Rorizo ​​n จูเนียร์

1
ไม่ใช่คำตอบที่แท้จริง คุณจะพูดอย่างนั้นได้อย่างไร ฉันตอบสิ่งที่ถูกถามอย่างแม่นยำ OP ไม่ได้ถามวิธีการย้ายแอปพลิเคชัน Swing ไปยัง GTK
Jo-Erlend Schinstad

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.