摇摆:将切换button与一组button连同相应的菜单项一起链接

对于学校项目,我需要制作一个简单的绘画应用程序,可以绘制线条,椭圆形和矩形。

该分配指定我需要每种形状的工具栏button菜单项。

我想通过在工具栏中的buttonJToggleButtons和菜单项JRadioButtonMenuItems超出一点。 此外,我希望当您select其中一个工具栏button时,它会取消select其他菜单项,select适当的菜单项,并取消select其他菜单项。 select其中一个菜单项也是如此。

我知道我可以将任何AbstractButton与一个ButtonGroup分组,但是我不确定这是否是正确的方法,因为虽然它处理一个button的“组”,但我不确定它是否可以处理两个并行的组。

这样做没有ButtonGroup意味着在6个事件监听器的每一个,我将不得不手动取消select其他button,每对将调用相同的代码来设置形状types。

我也可以做两个ButtonGroup ,一个用于菜单,一个用于工具栏,但是我也必须复制形状types设置代码。

在任何一种情况下,我也冒着设置一个button的菜单的风险,它设置一个菜单项,设置一个button,广告infintum。

解决这个问题的最好方法是什么?

(能够用Netbeans GUIdevise器解决问题的奖励点;它更简单)

如果您有两个或两个以上执行相同function的组件,则Action接口是一种有效的方法,如“ 如何使用操作”中所述 。 特别是,一个Action将允许您的button和菜单项使用相同的代码。

附录:下面的例子展示了JMenuJToolBar如何为几个文件中的每一个共享同一个Action

 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; } }