Galera, após pesquisar muito na web, e tentar decifrar outras linguagens de programação consegui realizar a façanha de criar um menu dinâmico, porém, ainda não testei com vários níveis, mas mesmo assim vou postar o código aqui para quem quiser testar e corrigir ficar a vontade para fazê-lo.
/**
* Realiza a montagem da Barra de Menus do sistema baseando-se no conteúdo
* do banco de dados.
*
* @param vNewList Lista de Objetos do tipo <tt>Menu</tt> contendo as
* informações de menus do sistema armazenadas no banco de dados.<p> É o
* conteúdo da tabela <tt>menu</tt> no banco de dados.<p> NÃO É A CLASSE
* <tt>java.awt.Menu</tt>.
* @return Objeto do tipo <tt>javax.swing.JMenuBar</tt> contendo a barra de
* menus montada.
*/
public static JMenuBar criaBarraMenus(List<Menu> vNewList) {
JMenuBar barraMenus = new JMenuBar();
for (int i = 0; i < vNewList.size(); i++) {
Menu menu = vNewList.get(i);
if (menu.getNrMenupai() == null) {
barraMenus.add(criaMenu(vNewList, menu));
}
}
barraMenus.setFont(new Font("Segoe UI", Font.PLAIN, 12));
return barraMenus;
}
/**
* Realiza a montagem dos ítens de Menu para serem adicionados à Barra de
* Menus.
*
* @param vNewList Lista de Objetos do tipo <tt>Menu</tt> contendo as
* informações de menus do sistema armazenadas no banco de dados.<p> É o
* conteúdo da tabela <tt>menu</tt> no banco de dados.<p> NÃO É A CLASSE
* <tt>java.awt.Menu</tt>.
* @return Objeto do Tipo <tt>javax.swing.JComponent</tt> representando um
* ítem a ser adicionado à Barra de Menus.
*/
private static JComponent criaMenu(List<Menu> vlstMenus, Menu vNewMenu) {
JComponent cmpMenu = null;
if (vNewMenu.getNrMenupai() == null && !vNewMenu.getBlMenupopup()) {
cmpMenu = new JMenu(vNewMenu.getDsTitulo());
cmpMenu.setName(vNewMenu.getNmMenu());
cmpMenu.setActionMap(null); //Não adicionei nenhuma ação ainda.
if (possuiFilho(vNewMenu.getNrMenu(), vlstMenus)) {
for (int i = 0; i < vlstMenus.size(); i++) {
Menu itemMenu = vlstMenus.get(i);
if (itemMenu.getNrMenupai() != null) {
if (itemMenu.getNrMenupai().getNrMenu() == vNewMenu.getNrMenu()) {
cmpMenu.add(criaMenu(vlstMenus, itemMenu));
}
}
}
}
} else if (vNewMenu.getNrMenupai() != null && !vNewMenu.getBlMenupopup()) {
if (possuiFilho(vNewMenu.getNrMenu(), vlstMenus)) {
for (int i = 0; i < vlstMenus.size(); i++) {
Menu itemMenu = vlstMenus.get(i);
if (itemMenu.getNrMenupai() != null) {
cmpMenu = new JMenu(itemMenu.getDsTitulo());
cmpMenu.setName(itemMenu.getNmMenu());
cmpMenu.setActionMap(null); //Não adicionei nenhuma ação ainda.
if (itemMenu.getNrMenupai().getNrMenu() == vNewMenu.getNrMenu()) {
cmpMenu.add(criaMenu(vlstMenus, itemMenu));
}
}
}
} else {
cmpMenu = new JMenuItem(vNewMenu.getDsTitulo());
cmpMenu.setName(vNewMenu.getNmMenu());
cmpMenu.setActionMap(null); //Não adicionei nenhuma ação ainda.
}
}
return cmpMenu;
}
/**
* Verifica a existência de um nível inferior para o ítem de Menu.
*
* @param idMenu ID do menu pai.
* @param vlstMenus Lisa de Menus para realizar a pesquisa.
* @return <tt>true</tt> caso o ítem pesquisado possua um "filho",
* <tt>false</tt> caso contrário.
*/
private static boolean possuiFilho(short idMenu, List<Menu> vlstMenus) {
List<Menu> lstMenus = vlstMenus;
for (int i = 0; i < lstMenus.size(); i++) {
Menu itemMenu = lstMenus.get(i);
if (itemMenu.getNrMenupai() != null) {
if (idMenu == itemMenu.getNrMenupai().getNrMenu()) {
return true;
}
}
}
return false;
}
Esta é a estrutura da tabela no banco de dados.
Estou usando o PostgreSQL 9.2.
CREATE TABLE dbsghu.menu (
nr_menu SMALLINT DEFAULT nextval('menu_nr_id_seq'::regclass) NOT NULL,
nm_menu VARCHAR(30) NOT NULL,
ds_titulo VARCHAR(30) NOT NULL,
ds_menu VARCHAR(100),
nr_menupai SMALLINT,
nr_menuordem SMALLINT DEFAULT 0 NOT NULL,
im_menuicone BYTEA,
bl_menupopup BOOLEAN DEFAULT false NOT NULL,
nr_teclaatalho SMALLINT DEFAULT 0 NOT NULL,
bl_ocupado BOOLEAN DEFAULT false NOT NULL,
CONSTRAINT pk_menu1 PRIMARY KEY(nr_menu),
CONSTRAINT uk_menu1 UNIQUE(nm_menu),
CONSTRAINT fk_menu1 FOREIGN KEY (nr_menupai)
REFERENCES dbsghu.menu(nr_menu)
ON DELETE SET NULL
ON UPDATE CASCADE
DEFERRABLE
INITIALLY IMMEDIATE
)
WITH (oids = false);
COMMENT ON TABLE dbsghu.menu
IS 'Tabela de cadastro dos menus do sistema. Utilizada para cadastrar os menus e seus itens para permitir ou negar seu acesso por meio dos perfis.';
COMMENT ON COLUMN dbsghu.menu.nr_teclaatalho
IS 'Código ASCII da tecla que será utilizada como atalho.';
CREATE INDEX idx_menu1 ON dbsghu.menu
USING btree (nr_menupai NULLS FIRST, nr_menuordem, nr_menu);
Quem testar e fizer alguma correção, por favor, informe aqui para que possamos melhorar mais este código.
Agora só preciso saber como faço pra adicionar a ação ao clicar no botão do menu, sendo que não estou utilizando a classe JMenuItem mas sim a JComponent.
Alguém pode me ajudar?