Como faço para que meu aplicativo java seja compatível com o menu global de unidade?

11

Eu gosto de desenvolver em Java, mas também quero compatibilidade com o menu global? Há algum caminho? Por favor ajude.

    
por Ayush 26.01.2012 / 13:59

5 respostas

8

Existe uma biblioteca chamada java-gnome (um wrapper java gtk) que permite que seus aplicativos se comportem como todos os aplicativos nativos. Ele fornece toda a glória para eles: widgets nativos, menu global, etc.

A biblioteca está disponível nos repositórios do Ubuntu:

O objetivo da biblioteca é desenvolver uma experiência rica em Java + Gnome. Cuidado, que se você usar essa biblioteca, seu aplicativo perderá o recurso de multiplataforma do Java (já que ele estará vinculado ao java-gnome).

Aqui está um aplicativo de amostra (que vem com java-gnome) exibindo a integração do menu:

    
por Marcos Roriz Junior 29.01.2012 / 06:41
2

Tente Ayatana. Você pode encontrar instruções aqui: link

Tudo o que você precisa fazer é importar a Biblioteca Java Ayatana e chamá-la na sua classe principal JFrame. Isso realmente implica a adição do seguinte par de linhas em seu código (assim como a importação de classes Ayatana):

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

Aqui está um exemplo:

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

E o mais importante é que sua aplicação ainda é multiplataforma. Eu testei o exemplo acima no Ubuntu 12.04 LTS e no Windows XP.

    
por Diok 23.03.2013 / 17:19
1

Você pode usar um ppa: ppa: danjaredg / jayatana

link

    
por danjaredg 06.02.2014 / 06:04
0

Isso normalmente é feito no nível do kit de ferramentas, por exemplo, no GTK ou no Qt. Portanto, a maneira pretendida de fazer isso seria remendar o Swing, se esse for o kit de ferramentas GUI que você está usando. No entanto, todos os componentes do Unity se comunicam usando o DBus, portanto, se você realmente quiser, você mesmo pode fazer isso implementando a API do DBus. Se você quiser fazer isso, você pode querer dar uma olhada no libdbusmenu e ver como ele funciona.

    
por Jo-Erlend Schinstad 26.01.2012 / 14:49
0

Não é uma correção para você, mas FYI: Eu arquivei o bug # 984916 do Ubuntu para rastrear o fato de que os menus Swing não são (semi-) integrados automaticamente no menu global.

    
por Jesse Glick 18.04.2012 / 15:59