Árvore com componentes de um JFrame. É possível?

Aí galera, é o seguinte.

Estou querendo fazer um formulário que liste os componentes de outros formulários em forma de árvore (mais precisamente, os menus e botões), assim posso estabelecer permissões a usuários de maneira mais fácil e rápida.

Exemplo: Se o usuário não é do contas a receber, basta ocultar o menu Clientes no formulário principal.

Utilize o botão direito do mouse na janela Listagem e poderá habilitar e desabilitar os componentes do formulário.

import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.*;


public class Formulario extends JFrame {
	JMenuBar barra;
	JMenu mnuarquivo;
	JMenu mnuopcoes;
	JMenuItem mnusair;
	JMenuItem mnucliente;
	JMenuItem mnupagar;
	JMenuItem mnureceber;
	JButton cmdsair;
	JButton cmdcliente;
	JButton cmdpagar;
	JButton cmdreceber;
	JButton cmdnovo;
	JButton cmdgravar;
	JTextField txtcodigo;
	JTextField txtnome;
	JToolBar tool;
	JPanel centro;

	JMenu mnuconfiguracoes;
	JCheckBoxMenuItem mnuseguranca;
	
	public Formulario() {
		super();
		barra = new JMenuBar();
		mnuarquivo = new JMenu("Arquivo");
		mnuopcoes = new JMenu("Opcoes");
		mnusair = new JMenuItem("Sair");
		mnucliente = new JMenuItem("Cliente");
		mnupagar = new JMenuItem("Pagar");
		mnureceber = new JMenuItem("Receber");
		mnuconfiguracoes = new JMenu("Configurações");
		mnuseguranca = new JCheckBoxMenuItem("Segurança");

		barra.add(mnuarquivo);
		barra.add(mnuopcoes);

		mnuarquivo.add(mnusair);
		mnuopcoes.add(mnucliente);
		mnuopcoes.add(mnupagar);
		mnuopcoes.add(mnureceber);
		mnuconfiguracoes.add(mnuseguranca);
		mnuopcoes.add(mnuconfiguracoes);


		tool         = new JToolBar();
		cmdsair      = new JButton("Sair");
		cmdcliente   = new JButton("Cliente");
		cmdpagar     = new JButton("Pagar");
		cmdreceber   = new JButton("Receber");


		tool.add(cmdsair);
		tool.add(cmdcliente);
		tool.add(cmdpagar);
		tool.add(cmdreceber);


		centro = new JPanel(new GridLayout(0,2));
		txtcodigo = new JTextField();
		txtnome = new JTextField();
		txtcodigo.setName("txtcodigo");
		txtnome.setName("txtnome");
		
		cmdnovo = new JButton("Novo");
		cmdgravar = new JButton("Gravar");

		centro.add(new JLabel("Codigo"));
		centro.add(txtcodigo);
		centro.add(new JLabel("Nome"));
		centro.add(txtnome);
		centro.add(cmdnovo);				
		centro.add(cmdgravar);


		setSize(500,500);
		setJMenuBar(barra);	
		getContentPane().add(tool,BorderLayout.NORTH);
		getContentPane().add(centro,BorderLayout.CENTER);


		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		setTitle("Formulario 1");

		new Listagem(this);

	}



	public static void main(String[] args) {
		new Formulario();
	}


}



class Listagem extends JFrame {

	private JFrame objeto;
	private JTree arvore;
	private DefaultTreeModel modelo;
	private ItemArvore node;
	private JScrollPane scroll;

	private ItemArvore menus;
	private ItemArvore botoes;
	private ItemArvore textos;
	
	private JPopupMenu menu;
	private JMenuItem opcao;

	public Listagem(JFrame objeto) {
		super();
		this.objeto = objeto;

		node = new ItemArvore(objeto.getTitle());
		menus = new ItemArvore("Menus");
		botoes = new ItemArvore("Botoes");
		textos = new ItemArvore("Textos");
		node.add(menus);
		node.add(botoes);
		node.add(textos);
		
		
		modelo = new DefaultTreeModel(node);
		arvore = new JTree(modelo);
		scroll = new JScrollPane(arvore);
		getContentPane().add(scroll,BorderLayout.CENTER);

		preencher(objeto.getContentPane());
		preencherMenu(objeto.getJMenuBar().getSubElements()	,menus);

		menu = new JPopupMenu();
		opcao = new JMenuItem("Desabilitar");
		menu.add(opcao);


		arvore.addMouseListener(new MouseAdapter() {

			public void mouseClicked(MouseEvent e) {
			ItemArvore n = (ItemArvore) arvore.getLastSelectedPathComponent();

			if (e.getButton() > 1) {
				if (n != null) {
				  if (n.getComponente() != null) {
                                    if (n.getComponente().isEnabled()) {
					opcao.setText("Desabilitar");					
				    } else {
					opcao.setText("Habilitar");									    
				    }
				     menu.show(arvore,e.getX(),e.getY());
				  }

				}
			}

			}

		});	
		
		opcao.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
			    ItemArvore n = (ItemArvore) arvore.getLastSelectedPathComponent();

			    if (n == null) {
			        return;
			    }

			    if (n.getComponente() != null) {
				if (n.getComponente().isEnabled()) {
				   n.getComponente().setEnabled(false);
				} else {
				   n.getComponente().setEnabled(true);				
				}

			    }			

			}

		});

		setSize(300,500);
		setLocation(500,0);
		setVisible(true);
		setTitle("Listagem");
	}


	private void preencher(Container container) {
		Component[] componentes;
		ItemArvore n = null;
	
		componentes = container.getComponents();
	
		for (int i=0;i < componentes.length;i++) {
			if (componentes[i] instanceof Container) {
				preencher((Container) componentes[i]);
			} 
	
			if (componentes[i] instanceof JButton) {
				n = new ItemArvore(((JButton) componentes[i]).getText());
				n.setComponente(componentes[i]);
				botoes.add(n);
			}


			if (componentes[i] instanceof JTextField) {
				n = new ItemArvore(((JTextField) componentes[i]).getName());
				n.setComponente(componentes[i]);
				textos.add(n);
			}
			
			

		}
		
	}

	private void preencherMenu(MenuElement[] elementos,ItemArvore item) {
		ItemArvore n = null;

		for (int i=0;i<elementos.length;i++) {
				
			if (elementos[i].getSubElements().length > 0) {


				if (elementos[i] instanceof JPopupMenu) {
				n = item;
				} else {
				n = new ItemArvore(((JMenuItem) elementos[i]).getText());
				n.setComponente(elementos[i].getComponent());
				item.add(n);
				}
				preencherMenu(elementos[i].getSubElements(),n);			
			} else {
		
				n = new ItemArvore(((JMenuItem) elementos[i]).getText());
				n.setComponente(elementos[i].getComponent());

				item.add(n);
			}

		}

	} 
}


class ItemArvore extends DefaultMutableTreeNode {

	Component componente;


	public ItemArvore(Object userObject) {
		super(userObject);	
	}

	public void setComponente(Component componente){
		this.componente = componente;
	}


	public Component getComponente(){
		return componente;
	}
}

Valeu mesmo cara, a funcionalidade é 100%, infelizmente só tive tempo de testar neste feriado.

Vou tentar implementá o código botando as informações em uma tabela para serem usadas na hora de abrir formulários, verificando as permissões do usuário e configurando o form de acordo com elas.