Menubar de um modelo XML

Eu estou trabalhando em um objeto que cria um JMenuBar baseado em um modelo XML, e dessa forma evitar aquelas chatas e repetitivas linhas de código usado na criação de barras de menu.
O modelo é basicamente este:

<MenuBar>
    <Menu name="*Arquivo">
        <Menu name="*Novo">
            <MenuItem name="Item1" accel="ctrl A" action="Item1Action"/>
            <MenuItem name="Item2" accel="crtl B" action="Item2Action"/>
        </Menu>
        <Separator/>
        <MenuItem name="Exit" action="SairAction"/>
    </Menu>
</MenuBar>

Onde o atributo “action” informa o nome de uma classe que implementa ActionListener e trata o evento do item. O problema é o seguinte se eu tenho uma classe de eventos externa como faço p/ ela agir sobre os estados de um objeto???

Com uma classe tratadora de eventos separada fica meio chato implementar isso…

Quando precisei fazer menus dinâmicos, o que eu fiz foi criar uma action e associá-la direto ao JMenuItem…dessa forma, a tal “tratadora de eventos” é eliminada e o próprio menu item sabe o que fazer quando for clicado.

Um amigo meu usou essa abordagem, mas isso gera uma codificação indesejavel onde vc tem que iteragir com o componente que será criado simultaneamente no arquivo XML, que define a sua aparencia, e no código para o tratamento de eventos. Me parece muito mais natural o uso de XML definir tudo, tenho conseguito associar o objeto tratador de eventos ao item de menu mas associa-lo ao objeto que sefrerá as modificações é bem mais complicado.

Concordo com você, um fica muito dependente do outro.

Se você for definir tudo no XML, de toda forma, terá de ter um tratador de eventos único que testará qual é o objeto causador do evento, certo? Acho que a tratadora de eventos ainda fica dependente do XML, com a diferença de isso ser feito pelo nome.

Acho que o complicado dessa situação é que o XML vai guardar informações sobre o menu, mas as ações a serem tomadas, de toda forma, devem ser todas implementadas e guardadas no código-fonte…aí, na minha opinião, acho que o XML terá pouca utilidade, não??

Talvez uma solução utilizando apenas Java para reduzir a codificação tediosa de menus seria a criação de um MenuFactory, no qual você teria métodos como addParentMenu, addItemToMenu, addSeparator e esses tipos de coisa, no qual grande parte do código de construção do menu ficaria na fábrica e você poderia apenas criar Actions para os menus e adicionar essas actions aos menus da fábrica. Já implementei isso uma vez e a classe realmente reduziu o código para criação do menu na aplicação, além de ser uma solução puramente Java…pense nisso :wink: