Gostaria de saber se alguem já fez um menu JMenu, dinamico pois estou precisando fazer um, com base em informações de uma arquivo XML e/ou banco de dados. Gostaria de saber como monto ele e como incluo os eventos. Procurei no forum mas só fala a respeito de menus web
E no exemplo abaixo eu estou gerando os menus mas não estou atribuindo ações. Nada que você não possa resolver após ler alguma coisa dali de cima.
importjavax.swing.JFrame;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;importjavax.swing.JMenu;importjavax.swing.JButton;importjavax.swing.JTextField;importjava.awt.event.ActionListener;importjava.awt.event.ActionEvent;importjava.awt.FlowLayout;/* Classe que vamos usar para "dar boot" da coisa toda*/publicclassDynaMenu{publicstaticvoidmain(String[]ooiaaaa){newInsertor(newJanela());}}/* Janela dotada de inserção dinâmica de menus; vc pode arranjar seus menus a partir de qualquer coisa; aqui eu pego eles de strings.*/classJanelaextendsJFrame{privateJMenuBarmBar;publicJanela(){setTitle("janela de menu dinâmico");mBar=newJMenuBar();setJMenuBar(mBar);setLayout(null);setVisible(true);setDefaultCloseOperation(Janela.EXIT_ON_CLOSE);pack();}publicJanelainsertMenu(Stringmenu){mBar.add(seekMenu(menu));returnthis;}publicJanelainsertItem(StringmenuName,Stringitem){JMenuItemjmi=newJMenuItem(item);seekMenu(menuName).add(jmi);returnthis;}publicJanelaremoveMenu(StringmenuName){mBar.remove(seekMenu(menuName));returnthis;}privateJMenuseekMenu(Stringnome){booleanprocurando=true;intindex=0;while(procurando){if(mBar.getMenu(index)!=null&&mBar.getMenu(index).getText().equals(nome)){returnmBar.getMenu(index);}elseif(mBar.getMenu(index)==null)procurando=false;elseindex++;}JMenubtwMenu=newJMenu(nome);returnbtwMenu;}publicvoidpack(){super.pack();setSize(640,480);// TODO - arranjar uma solução melhor que essa; temos um pequeno pau no refresh do menu...}}/* Pra testar a inserção dinâmica de menus.*/classInsertorextendsJFrameimplementsActionListener{privateJButtoninserir;privateJButtonremover;privateJTextFieldmenu;privateJTextFieldsubMenu;privateJanelaj;publicInsertor(Janelaj){setTitle("teste de inserção");this.j=j;setLayout(newFlowLayout());inserir=newJButton("Inserir");inserir.addActionListener(this);remover=newJButton("Remover");remover.addActionListener(this);menu=newJTextField(" ");subMenu=newJTextField(" ");add(menu);add(subMenu);add(inserir);add(remover);pack();setVisible(true);setDefaultCloseOperation(Insertor.EXIT_ON_CLOSE);}publicvoidactionPerformed(ActionEvente){if(e.getSource()==inserir&&ehValido()){j.insertMenu(menu.getText()).insertItem(menu.getText(),subMenu.getText());}elseif(e.getSource()==remover&&ehValido()){j.removeMenu(menu.getText());}j.pack();}privatebooleanehValido(){if(menu.getText().trim().equals(""))returnfalse;elsemenu.setText(menu.getText().trim());if(subMenu.getText().trim().equals(""))returnfalse;elsesubMenu.setText(subMenu.getText().trim());returntrue;}}
recomendo trabalhar num parser de modo que vc possa produzir algo como um array ou lista… e quanto aos eventos, bom, acho que vc vai precsiar dum bixo bem feio e genérico que implemente o Action (ActionListener, dê uma olhada nessa interface e suas aplicações!) uma vez que vc não terá exatamente o controle do que vai vir do xml, correto? tipo um negoço que faça CrUDe de forma genérica e use o ítem de menu (ou alguma outra coisa q vc recupere…) como parâmetro.
boa sorte 8)
I
icefox
Obrigado Sombriks, vou usar a sua dica e os links !! Assim que tiver concluido falo se obtive exito !!!
Vlw
J
jaimealcides
Sombriks:
Ok, eu estou supondo que você já saiba como recuperar coisas de um xml ou SGDB.
E no exemplo abaixo eu estou gerando os menus mas não estou atribuindo ações. Nada que você não possa resolver após ler alguma coisa dali de cima.
importjavax.swing.JFrame;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;importjavax.swing.JMenu;importjavax.swing.JButton;importjavax.swing.JTextField;importjava.awt.event.ActionListener;importjava.awt.event.ActionEvent;importjava.awt.FlowLayout;/* Classe que vamos usar para "dar boot" da coisa toda*/publicclassDynaMenu{publicstaticvoidmain(String[]ooiaaaa){newInsertor(newJanela());}}/* Janela dotada de inserção dinâmica de menus; vc pode arranjar seus menus a partir de qualquer coisa; aqui eu pego eles de strings.*/classJanelaextendsJFrame{privateJMenuBarmBar;publicJanela(){setTitle("janela de menu dinâmico");mBar=newJMenuBar();setJMenuBar(mBar);setLayout(null);setVisible(true);setDefaultCloseOperation(Janela.EXIT_ON_CLOSE);pack();}publicJanelainsertMenu(Stringmenu){mBar.add(seekMenu(menu));returnthis;}publicJanelainsertItem(StringmenuName,Stringitem){JMenuItemjmi=newJMenuItem(item);seekMenu(menuName).add(jmi);returnthis;}publicJanelaremoveMenu(StringmenuName){mBar.remove(seekMenu(menuName));returnthis;}privateJMenuseekMenu(Stringnome){booleanprocurando=true;intindex=0;while(procurando){if(mBar.getMenu(index)!=null&&mBar.getMenu(index).getText().equals(nome)){returnmBar.getMenu(index);}elseif(mBar.getMenu(index)==null)procurando=false;elseindex++;}JMenubtwMenu=newJMenu(nome);returnbtwMenu;}publicvoidpack(){super.pack();setSize(640,480);// TODO - arranjar uma solução melhor que essa; temos um pequeno pau no refresh do menu...}}/* Pra testar a inserção dinâmica de menus.*/classInsertorextendsJFrameimplementsActionListener{privateJButtoninserir;privateJButtonremover;privateJTextFieldmenu;privateJTextFieldsubMenu;privateJanelaj;publicInsertor(Janelaj){setTitle("teste de inserção");this.j=j;setLayout(newFlowLayout());inserir=newJButton("Inserir");inserir.addActionListener(this);remover=newJButton("Remover");remover.addActionListener(this);menu=newJTextField(" ");subMenu=newJTextField(" ");add(menu);add(subMenu);add(inserir);add(remover);pack();setVisible(true);setDefaultCloseOperation(Insertor.EXIT_ON_CLOSE);}publicvoidactionPerformed(ActionEvente){if(e.getSource()==inserir&&ehValido()){j.insertMenu(menu.getText()).insertItem(menu.getText(),subMenu.getText());}elseif(e.getSource()==remover&&ehValido()){j.removeMenu(menu.getText());}j.pack();}privatebooleanehValido(){if(menu.getText().trim().equals(""))returnfalse;elsemenu.setText(menu.getText().trim());if(subMenu.getText().trim().equals(""))returnfalse;elsesubMenu.setText(subMenu.getText().trim());returntrue;}}
recomendo trabalhar num parser de modo que vc possa produzir algo como um array ou lista… e quanto aos eventos, bom, acho que vc vai precsiar dum bixo bem feio e genérico que implemente o Action (ActionListener, dê uma olhada nessa interface e suas aplicações!) uma vez que vc não terá exatamente o controle do que vai vir do xml, correto? tipo um negoço que faça CrUDe de forma genérica e use o ítem de menu (ou alguma outra coisa q vc recupere…) como parâmetro.
boa sorte 8)
Bom dia caro colega muito legal o que você postou nesse tópico já foi de grande ajuda também estou com esse problema, gostaria de saber se você já conseguiu montar o menu dinamicamente com vários níveis porque nesse exemplo ele monta só o menu e os itens se um menu tiver mais de um nivel não cria. Você já fez algo parecido ou sabe onde posso encotrar.
Abraço e deste já muito obrigado.
fantomas
Dicas para iniciar com grandes chances de terminar esta idéia bacana.
Monte a estrutura de dados; o arquivo xml de fato.
Monte a outra estrutura de dados; a tabela do menu de fato.
Pense no algoritimo para ler estas estrutura de dados; recursividade neste ponto certamente é a saida, faça uma boa revisão.
A interface (view) deverá, se possível, receber uma estrutura de dados única, sem saber de onde veio (banco, xml, etc…) e nem como ela foi construida - talvez uma factory aqui fique interessante.
Construir algoritimo para ler a estrutura de dados mencionada no item 4 (rever item 3).
Disponibilizar o menu para testes.
Incluir um post no guj dizendo que “a coisa” deu certo (tinha que ter um item bacana de fazer).
Underdog / blackhorse challenge : Executar o diabo do evento.
A partir de uma string “br.com.myEventClass” podemos fazer com que o classloader construa os objetos para nós.
É isso ai…tem a opção de começar pelo item 4 e depois ir para o item 1 e 2.
Juro que estou tentando ajudar, longe de mim querer deprimir alguem com estas idéias.