JMenu Dinamico

4 respostas
I

Oi Pessoal,

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

4 Respostas

Sombriks

Ok, eu estou supondo que você já saiba como recuperar coisas de um xml ou SGDB.

Estes links da API são muito interessantes, :smiley:

http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JMenu.html
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JMenuBar.html
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JMenuItem.html

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.

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JMenu;
import javax.swing.JButton;
import javax.swing.JTextField;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.FlowLayout;

/*
	Classe que vamos usar para "dar boot" da coisa toda
*/
public class DynaMenu{
	public static void main(String[]ooiaaaa){
		new Insertor(new Janela());
	}
}

/*
	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.
*/
class Janela extends JFrame {

	private JMenuBar mBar;
	
	public Janela(){
		setTitle("janela de menu dinâmico");
		mBar=new JMenuBar();
		setJMenuBar(mBar);
		setLayout(null);
		setVisible(true);
		setDefaultCloseOperation(Janela.EXIT_ON_CLOSE);
		pack();
	}
	
	public Janela insertMenu(String menu){
		mBar.add(seekMenu(menu));
		return this;
	}

	public Janela insertItem(String menuName,String item){
		JMenuItem jmi= new JMenuItem(item);
		seekMenu(menuName).add(jmi);
		return this;
	}

	public Janela removeMenu(String menuName){
		mBar.remove(seekMenu(menuName));
		return this;
	}

	private JMenu seekMenu(String nome){
		boolean procurando=true;
		int index=0;
		while(procurando){
			if(mBar.getMenu(index)!= null && mBar.getMenu(index).getText().equals(nome)){
				return mBar.getMenu(index);
			}else if(mBar.getMenu(index)==null)
				procurando=false;
			else index++;
		}JMenu btwMenu = new JMenu(nome);
		return btwMenu;
	}

	public void pack(){
		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.
*/
class Insertor extends JFrame implements ActionListener {
	
	private JButton inserir;
	private JButton remover;
	private JTextField menu;
	private JTextField subMenu;
	private Janela j;
	
	public Insertor(Janela j){
		setTitle("teste de inserção");
		this.j = j;
		setLayout(new FlowLayout());
		inserir = new JButton("Inserir");
		inserir.addActionListener(this);
		remover = new JButton("Remover");
		remover.addActionListener(this);
		menu = new JTextField("		");
		subMenu = new JTextField("		");
		add(menu);
		add(subMenu);
		add(inserir);
		add(remover);
		pack();
		setVisible(true);
		setDefaultCloseOperation(Insertor.EXIT_ON_CLOSE);
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource() == inserir && ehValido()){
			j.insertMenu(menu.getText()).insertItem(menu.getText(),subMenu.getText());
		}else if(e.getSource() == remover && ehValido()){
			j.removeMenu(menu.getText());
		}j.pack();
	}

	private boolean ehValido(){
		if(menu.getText().trim().equals(""))
			return false;
		else menu.setText(menu.getText().trim());
		if(subMenu.getText().trim().equals(""))
			return false;
		else subMenu.setText(subMenu.getText().trim());
		return true;
	}
}

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

Obrigado Sombriks, vou usar a sua dica e os links !! Assim que tiver concluido falo se obtive exito !!!

Vlw

J

Sombriks:
Ok, eu estou supondo que você já saiba como recuperar coisas de um xml ou SGDB.

Estes links da API são muito interessantes, :smiley:

http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JMenu.html
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JMenuBar.html
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JMenuItem.html

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.

import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JMenu;
import javax.swing.JButton;
import javax.swing.JTextField;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.FlowLayout;

/*
	Classe que vamos usar para "dar boot" da coisa toda
*/
public class DynaMenu{
	public static void main(String[]ooiaaaa){
		new Insertor(new Janela());
	}
}

/*
	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.
*/
class Janela extends JFrame {

	private JMenuBar mBar;
	
	public Janela(){
		setTitle("janela de menu dinâmico");
		mBar=new JMenuBar();
		setJMenuBar(mBar);
		setLayout(null);
		setVisible(true);
		setDefaultCloseOperation(Janela.EXIT_ON_CLOSE);
		pack();
	}
	
	public Janela insertMenu(String menu){
		mBar.add(seekMenu(menu));
		return this;
	}

	public Janela insertItem(String menuName,String item){
		JMenuItem jmi= new JMenuItem(item);
		seekMenu(menuName).add(jmi);
		return this;
	}

	public Janela removeMenu(String menuName){
		mBar.remove(seekMenu(menuName));
		return this;
	}

	private JMenu seekMenu(String nome){
		boolean procurando=true;
		int index=0;
		while(procurando){
			if(mBar.getMenu(index)!= null && mBar.getMenu(index).getText().equals(nome)){
				return mBar.getMenu(index);
			}else if(mBar.getMenu(index)==null)
				procurando=false;
			else index++;
		}JMenu btwMenu = new JMenu(nome);
		return btwMenu;
	}

	public void pack(){
		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.
*/
class Insertor extends JFrame implements ActionListener {
	
	private JButton inserir;
	private JButton remover;
	private JTextField menu;
	private JTextField subMenu;
	private Janela j;
	
	public Insertor(Janela j){
		setTitle("teste de inserção");
		this.j = j;
		setLayout(new FlowLayout());
		inserir = new JButton("Inserir");
		inserir.addActionListener(this);
		remover = new JButton("Remover");
		remover.addActionListener(this);
		menu = new JTextField("		");
		subMenu = new JTextField("		");
		add(menu);
		add(subMenu);
		add(inserir);
		add(remover);
		pack();
		setVisible(true);
		setDefaultCloseOperation(Insertor.EXIT_ON_CLOSE);
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource() == inserir && ehValido()){
			j.insertMenu(menu.getText()).insertItem(menu.getText(),subMenu.getText());
		}else if(e.getSource() == remover && ehValido()){
			j.removeMenu(menu.getText());
		}j.pack();
	}

	private boolean ehValido(){
		if(menu.getText().trim().equals(""))
			return false;
		else menu.setText(menu.getText().trim());
		if(subMenu.getText().trim().equals(""))
			return false;
		else subMenu.setText(subMenu.getText().trim());
		return true;
	}
}

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.

  1. Monte a estrutura de dados; o arquivo xml de fato.

  2. Monte a outra estrutura de dados; a tabela do menu de fato.

  3. Pense no algoritimo para ler estas estrutura de dados; recursividade neste ponto certamente é a saida, faça uma boa revisão.

  4. 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.

  5. Construir algoritimo para ler a estrutura de dados mencionada no item 4 (rever item 3).

  6. Disponibilizar o menu para testes.

  7. 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.

flws

Criado 14 de fevereiro de 2007
Ultima resposta 29 de mai. de 2009
Respostas 4
Participantes 4