Menu Swing Dinâmico

10 respostas
santoro

Pessoal, estou precisando montar um menu dinâmico que seja montado de acordo com o banco de dados, porém estou tendo problemas quando tenho vários níveis.

Alguém já montou algo do gênero? Que componente utilizou? O que aconselham?

E quanto a modelagem do banco, qual a maneira que acham melhor? Estava pensando em uma tabela do tipo

CODIGO_MENU
DESCRICAO
COMANDO
CODIGO_MENU_PAI

mas acho que vai ficar complicado para montar o menu desta maneira, gostaria de sugestões.

10 Respostas

fabiofalci

Agora tu cria chaves de next/previous ou mesmo um inteiro para definir a ordem dentro de um nivel de menu.

santoro

Mas se eu defino desta maneira já não daria certo?

codigo - descricao - codigo_pai

1 - principal - null
2 - cadastro - 1 --> este fica dentro do menu principal
3 - pessoas - 2 --> este fica dentro do menu de cadastro
4 - consultas - 1 --> este fica dentro do menu principal

fabiofalci

Até dá…
Mas como tu vai controlar a ordem dos menus?
Simplesmente na ordem que retornar do teu select?

E se tu quiser mexer na ordem?

santoro

Perfeito, então eu precisaria de uma tabela contendo

CODIGO
DESCRICAO
CODIGO_PAI
ORDEM

mas existe algo que facilite a montagem deste menu, senão vou precisar fazer vários loops para gerar corretamente os nós no Menu, qual componente você aconselha?

fabiofalci

Exato.
Ou ordem ou chaves para next/previous.

Tu resolve isso fazendo consultas SQL (ou hql se hibernate), pegando esse retorno e transformando em
JMenu e JMenuItem
Não tem muito como fugir de loops

santoro

Resgatando este tópico estou com o seguinte problema, quando crio um subitem não consigo retornar ao item, já refiz várias vezes o meu código e não consegui uma solução, por exemplo

deveria ser assim

CADASTRO

  • CADASTRO 1
    —CADASTRO 1.1
    —CADASTRO 1.2
    -CADASTRO 2
  • CADASTRO 3

e acaba ficando assim

CADASTRO

  • CADASTRO 1
    —CADASTRO 1.1
    —CADASTRO 1.2
    —CADASTRO 2
    — CADASTRO 3

não consigo de maneira alguma retornar a instância pai, como eu poderia resolver este problema? Alguém já fez esta implementação?

fabiofalci

Sim, eu fiz. É um método recursivo que vai criando os menus/itens.

Coloca ai pedaços do teu código, vamos ver

santoro

por não ter conseguido acabei apagando a última versão, mas era algo mais ou menos assim :

public JMenuBar createMenuBar() {
  	       JMenuBar menuBar = new JMenuBar();
		   List lista = null;
		   try {
	 		    MontaMenu mm = new MontaMenu();
				mm.montaMenu();
				lista = mm.getNovaLista();
		   } catch (SQLException e) {			
			e.printStackTrace();
		   }
		   
		   
		   for (int i = 0; i < lista.size(); i++)
		   {
			   
			   TMenu menu = (TMenu)lista.get(i);
			   if (menu.getIdMenuPai() == null)
			   {
				   JMenu jmenu = new JMenu();
				   this.setMenu(null);
				   this.setMenu(jmenu);
				   this.setMenu(this.criaPai(menu.getMenu()));
			   }
			   else
			   {
				   this.criaSubmenu(this.getMenu(), menu, menu.getTipo().intValue());
			   }
		   }
  	       this.desenhaMenu(menuBar);
           return menuBar;
	    }

	    private JMenu criaPai(String nome)
	    {
	        JMenu menu = new JMenu(nome);
	        this.getListaMenuHorizontal().add(menu);
	        return menu;
	    }
   
	    
	    private void criaSubmenu(JMenu menu, final TMenu filho, int tipo)
	    {
	    	if (tipo == 1)
	    	{
		    	JMenuItem menuItem = new JMenuItem(filho.getMenu());
		        menuItem.addActionListener(new ActionListener() 
		        						   {
		            						  public void actionPerformed(ActionEvent ae) 
		            						  {
		            							  String comando = filho.getComando();
		            							  
		            							  if (comando.trim().toUpperCase().equals("SAIR"))
		            							  {
		            								  sairSistema();
		            							  }
		            							  else
		            							  {
			            							  try {
															Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL "+comando);
														} catch (IOException e) {
															e.printStackTrace();
														}	
		            							  }
		            						  }
		            					   });
		        menu.add(menuItem);
	    	}
	    	else
	    	{
	    		JMenu submenu = new JMenu(filho.getMenu());
	    		menu.add(submenu);
	    		this.setMenu(submenu);
    		
	    	}
	    }
	    
	    
	    private void desenhaMenu(JMenuBar menuBar)
	    {
	    	for (int i=0; i < this.getListaMenuHorizontal().size(); i++)
	    	{
	    		JMenu menu = (JMenu)this.getListaMenuHorizontal().get(i);
	    		menuBar.add(menu);
	    	}
	    }

teria como você disponibilizar o que você fez, ou parte do código para eu tentar entender onde estou errando?

fabiofalci

Cara, não tenho mais acesso a esse código. E não olhei o teu algoritmo em detalhes.

Mas ali na linha

Tu retorna uma lista de TMenu certo?

Esse TMenu ao invés de referenciar o próprio pai, referencia ao id do pai (getIdMenuPai).
De onde vem essa lista? do banco? tu esta usando hibernate?
Se sim essa estrutura pai-filho já poderia estar pronta através do hibernate!

santoro

Não, não estou utilizando hibernate por alguns motivos internos, e os dados são retornados do banco de dados.

Criado 8 de janeiro de 2008
Ultima resposta 26 de fev. de 2008
Respostas 10
Participantes 2