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


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 rica experiência Java + Gnome. Cuidado, se você usar esta 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 acompanha o java-gnome) exibindo a integração do menu:

Aplicativo de exemplo


Você confirmou que o libjava-gnome suporta o libdbusmenu? Afinal, a unidade não é um gnomo. Além disso, acho que mudar para outro kit de ferramentas da GUI apenas para usar um serviço dbus para ser bastante radical.
Jo-Erlend Schinstad

Sim, eu confirmei :).
Marcos Roriz Júnior

2

Tente Ayatana. Você pode encontrar instruções aqui: http://hanynowsky.wordpress.com/2012/05/12/integration-of-java-swing-applications-with-unity-global-menu-in-ubuntu-12-04/

Tudo o que você precisa fazer é importar a Biblioteca Java Ayatana e chamá-la na sua classe principal do JFrame. Na verdade, isso implica a adição das duas linhas a seguir no seu código (além de importar as 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 seu aplicativo ainda seja multiplataforma. Eu testei o exemplo acima no Ubuntu 12.04 LTS e no Windows XP.



0

Isso normalmente é feito no nível do kit de ferramentas, por exemplo, em GTK ou Qt. Portanto, a maneira pretendida de fazer isso seria corrigir o Swing, se esse é o kit de ferramentas da GUI que você está usando. No entanto, todos os componentes do Unity se comunicam usando o DBus; portanto, se você realmente quiser, poderá fazê-lo implementando a API do DBus. Se você quiser fazer isso, dê uma olhada no libdbusmenu e veja como ele funciona.


-1 por não ser uma resposta real e por solicitar que o op implemente o dbus.
Marcos Roriz Júnior

1
Não é uma resposta real? Como você pode dizer aquilo? Eu respondi precisamente o que foi perguntado. O OP não perguntou como portar um aplicativo Swing para o GTK.
Jo-Erlend Schinstad

0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.