Java com café: Como listar todos itens de um JMenuBar

Como listar todos itens de um JMenuBar

Hoje vou ensinar como retornar todos os objetos JMenuItems contidos num JMenuBar. Eventualmente você pode querer retornar também os objetos JMenu, então fica livre para fazer sua implementação do método.
O método que vou apresentar pode ser muito útil para fazer o controle de acesso da aplicação, permitindo que o item de menu seja exibido ou não de acordo com as permissões de cada usuário.
A estrutura de menus em Java é basicamente a seguinte:

JMenubar
   |
   |__ JMenu
   |       |
   |       |__JMenuItem
   |  
   |__JMenu
           |
           |__JMenu
                  |
                  |__JMenuItem

Como podemos observar, temos uma barra de menu e dentro dela temos 2 menus. No primeiro menu temos um item e no segundo temos um sub menu e dentro deste outro item. Então para recuperar todos itens, considerando que podem existir itens dentro de sub menus, devemos utilizar a recursividade.
Resumidamente, um método recursivo é um método que faz chamadas a ele mesmo. Certos problemas, como o apresentado, exigem esta abordagem, pois os elementos estão dispostos numa estrutura do tipo árvore que pode ter várias ramificações. Sendo assim, segue abaixo uma possível implementação do método que resolve este problema.

    /**
     * Retorna todos JMenuItems de um JMenuBar.
     *
     * @param obj Uma variável do tipo JMenuBar.
     * @return void
     */
    public void getMenuItems(Object obj) {

        if (obj instanceof JMenuBar) {

            for (Component c : ((JMenuBar) obj).getComponents()) {
                getMenuItems(c);
            }
        }

        if (obj instanceof JMenu) {

            for (Component c : ((JMenu) obj).getMenuComponents()) {
                getMenuItems(c);
            }
        }

        if (obj.getClass() == JMenuItem.class) {
            System.out.println("JMenuItem: " + ((JMenuItem) obj).getName());
        }

    }

Fiquem a vontade para modificar e utilizar. Até a próxima!

2 comentários: