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…
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…
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.
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);
}
}
}
Tenta usar o método “getSubElements()” do JMenu, ao invés de “getMenuComponents()”. Talvez seja esse seu problema. Tanto no JMenu quando no JMenuBar.
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);
}
}
}
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.
visola, blz… vou fazer pelo texto mesmo.
Valeu…