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.
t_java
Janeiro 19, 2008, 11:01am
#2
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.