JMenuBar

6 respostas
A

Fala galera blz?
Alguém tem um exemplo de um método recursivo onde eu passe um JMenuBar e ele me retorno todos os JMenus e os JMenuItens?

Valeu…

6 Respostas

visola

A classe JMenuBar tem um método getSubElements que retorna todos os JMenuItems dentro dela.
Você poderia criar um método que recebe um array de JMenuItem e retorna uma lista com todos os JMenuItems que ele encontrar. Este método chamaria o método getSubElements do JMenuItem que também retorna um array de JMenuItem e chamaria o mesmo método recursivamente.
Não sei se deu para entender. Veja se dá para começar alguma coisa com isso.

A

Fala Visola blz?
Na verdade eu ja havia tentado, vou postar o código que fiz comentado.
Eu criei um primeiro metodo que pega a JMenuBar e varre os JMenus, depois um segundo metodo recursivo onde ele recebe de parametro um JMenu.
Meu problema é que no metodo recursivo, meu if nao reconhece um JMenu e só os JMenuItem.
Ja fiz isso em Delphi e C# mas e Java sou novato hehe.

[]'s

Segue abaixo:

Primeiro método

//Esse metodo faz a primeira chamada e pego o JMenuBar.   
   public void LiberaTelas() {
       javax.swing.JMenuItem menuItem = null;
       javax.swing.JMenu menuPai = null;
       javax.swing.JMenu menuPaiSub = null;
       java.awt.Component[] components;

	   //Faz o laço no JMenuBar chamado jmGeral.
       for (int i = 0; i < jmGeral.getMenuCount(); i++) {
           menuPai = jmGeral.getMenu(i);

           System.out.println(menuPai.getText());
           components = menuPai.getMenuComponents();

		   //Aí ele começa outro laço nos JMenu ou JMenuItem
           for (int x = 0; x < components.length; x++) {

			   //Se for um Jmenu ele chama o metodo recursivo la de baixo (LiberaTelasfilhas).
			   //Ele cai no metodo LiberaTelasfilhas, porem quando é um JMenu ele nao reconhece como comentei la
			   // em baixo.
               if (components[x] instanceof javax.swing.JMenu) {
                   menuPaiSub = ((javax.swing.JMenu) components[x]);
                   System.out.println("-> " + menuPaiSub.getText());
                   LiberaTelasfilhas(menuPaiSub);
               }else if (components[x] instanceof javax.swing.JMenuItem) {
                   menuItem = ((javax.swing.JMenuItem) components[x]);
                   System.out.println("-> " + menuItem.getText());                  
               }

           }
       }

   }

Esse é o segundo método

//Função recursiva que recebe o JMenu.
public void LiberaTelasfilhas(javax.swing.JMenu menuPesq) {
       javax.swing.JMenuItem menuItem2 = null;
       javax.swing.JMenu menu2 = null;
       java.awt.Component[] componentsFilhos;

       componentsFilhos = menuPesq.getMenuComponents();      

	   //Aqui eu pegos os componentes do JMenu passado de parametro. Ele funciona e lista os 
	   //filhos, porem ele reconhece como se fosse todos JMenuItem.
       for (int i = 0; i < componentsFilhos.length; i++) {

           if (componentsFilhos[i] instanceof javax.swing.JMenuItem) {
               menuItem2 = menuPesq.getItem(i);
               System.out.println("    -> " + menuItem2.getText());
               //O problema ta aqui, ele não está reconhecendo que é um JMenu
			   //numca cai nesse if só no de cima
           }else if (componentsFilhos[i] instanceof javax.swing.JMenu) {
               menu2 = (javax.swing.JMenu)menuPesq.getComponent(i);
               System.out.println("**** Esse cara tem filhos" );
               LiberaTelasfilhas(menu2);
           }
       }
   }
visola

Tenta usar o método “getSubElements()” do JMenu, ao invés de “getMenuComponents()”. Talvez seja esse seu problema. Tanto no JMenu quando no JMenuBar.

A

Cara beleza?
Eu tentei com esse outro método mas não deu certo. Aí eu mudei a forma de comparar o a instancia se era JMenu e deu certo.
Só preciso acertar a lógica que quando o JMenu tem JMenuItens ele repete o nome do JMenu. Mas pelo menos ele percorre todos os itens.
Só não consegui fazer uma coisa, que é pegar o nome do Objeto. Por exemplo eu setei o nome da variável de um JMenuItem como jmAdministracao.
O texto eu pego normal com o getText(), eu usei o getName() para poder pegar o nome mas ele retorna null.

Abaixo o método recursivo que deu certo. O primeiro método que chama ele, está acima, não alterei ele.

Valeu.

public void LiberaTelasfilhas(javax.swing.JMenu menuPesq) {
        javax.swing.JMenuItem menuItem2 = null;
        javax.swing.JMenu menu2 = null;
        java.awt.Component[] componentsFilhos;        

        componentsFilhos = menuPesq.getMenuComponents();

        for (int i = 0; i < componentsFilhos.length; i++) {

            menuItem2 = menuPesq.getItem(i);            
            System.out.println("    -> " + menuItem2.getText());            

            if (componentsFilhos[i] instanceof javax.swing.JMenu) {
                menu2 = ((javax.swing.JMenu) componentsFilhos[i]);
                //Aqui eu tento pegar o nome do JMenu, mas ele retorno nulo, ja o texto vem normal.
                System.out.println("    -> " + menuItem2.getName() +"-"+ menuItem2.getText());
                LiberaTelasfilhas(menu2);
            }
        }
    }
visola

Pelo que eu entendo, getName retorna o nome que você setar lá. Então tem que chamar setName na hora de criar o componente.
Para usar com um sistema de segurança para saber qual menu será habilitado ou não, melhor usar o próprio texto do componente, pelo getText mesmo. Senão vai ter que chamar setName para todos os JMenuItems que você tem.

A

visola, blz… vou fazer pelo texto mesmo.

Valeu…

Criado 11 de maio de 2011
Ultima resposta 14 de mai. de 2011
Respostas 6
Participantes 2