Swing: alterna os botões de alternância com um grupo de botões, juntamente com itens de menu correspondentes

Para um projeto de escola, eu preciso fazer um aplicativo de pintura simples que possa desenhar linhas, ovais e retângulos.

A atribuição especifica que eu preciso de botões da barra de ferramentas e itens de menu para cada tipo de forma.

Eu gostaria de ir um pouco acima e além, fazendo os botões JToggleButtons na barra de ferramentas e os itens de menu JRadioButtonMenuItems . Além disso, quero que, quando você selecionar um dos botões da barra de ferramentas, ele desmarque os outros, selecione o item de menu apropriado e desmarque os outros itens de menu. O mesmo para selecionar um dos itens de menu.

Eu sei que posso agrupar qualquer AbstractButton com um ButtonGroup , mas não tenho certeza se este é o caminho certo a seguir, porque apesar de lidar com um “grupo” de botões muito bem, não tenho certeza se ele pode lidar com dois grupos paralelos.

Fazê-lo sem o ButtonGroup significaria que em cada um dos 6 ouvintes de events eu teria que desmarcar manualmente os outros botões, e cada par chamaria o mesmo código para definir o tipo de forma.

Eu também poderia fazer dois ButtonGroup s, um para o menu, um para a barra de ferramentas, mas também tenho que duplicar o código de configuração do tipo de forma.

Em qualquer situação, também corro o risco de o menu definir um botão que defina um item de menu que defina um botão, ad infintum.

Qual é a melhor maneira de resolver esse problema?

(Pontos de bônus para ser capaz de resolver o problema com o designer de GUI do NetBeans; é apenas mais fácil)

A interface Action é uma abordagem efetiva “se você tiver dois ou mais componentes que executam a mesma function”, conforme discutido em Como usar ações . Em particular, uma Action permitiria que seus botões e itens de menu usassem o mesmo código.

Adendo: O exemplo abaixo mostra como um JMenu e um JToolBar podem compartilhar a mesma Action para cada um dos vários arquivos.

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.io.File; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JToolBar; /** @see http://stackoverflow.com/questions/4038605 */ public class FileMenu { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { new FileMenu().create(); } }); } void create() { File userDir = new File(System.getProperty("user.dir")); File[] files = userDir.listFiles(); JMenu menu = new JMenu("Recent Files"); JToolBar toolBar = new JToolBar(JToolBar.VERTICAL); JLabel label = new JLabel(" ", JLabel.CENTER); for (File f : files) { if (f.isFile() && !f.isHidden()) { RecentFile rf = new RecentFile(f, label); menu.add(new JMenuItem(rf.getAction())); toolBar.add(rf.getAction()); } } JMenuBar menuBar = new JMenuBar(); menuBar.add(menu); JFrame f = new JFrame("FileMenu"); f.setJMenuBar(menuBar); f.add(toolBar, BorderLayout.CENTER); f.add(label, BorderLayout.SOUTH); f.pack(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLocationRelativeTo(null); f.setVisible(true); } } class RecentFile extends AbstractAction { private final File file; private final JLabel label; public RecentFile(final File file, final JLabel label) { this.file = file; this.label = label; this.putValue(Action.NAME, file.getName()); this.putValue(Action.SHORT_DESCRIPTION, file.getAbsolutePath()); } public void actionPerformed(ActionEvent e) { label.setText(file.getName()); } public Action getAction() { return this; } } 
Intereting Posts