对于一个学校项目,我需要制作一个简单的绘画应用程序,可以绘制线条,椭圆形和矩形.
分配指定我需要每种类型的形状的工具栏按钮和菜单项.
我想通过在工具栏中的按钮JToggleButtons和菜单项JRadioButtonMenuItems进行一点点的改进.此外,我想要它,以便当您选择一个工具栏按钮时,它将取消选择其他工具栏按钮,选择相应的菜单项,并取消选择其他菜单项.与选择其中一个菜单项相同.
我知道我可以使用ButtonGroup对任何AbstractButton进行分组,但是我不确定这是否是正确的方法,因为尽管它处理一个“组”按钮,但我不确定它可以处理两个并行组.
在没有ButtonGroup的情况下,这意味着在每个6个事件监听器中,我将不得不手动取消选择其他按钮,并且每一对将调用相同的代码来设置形状类型.
我也可以做两个ButtonGroups,一个用于菜单,一个用于工具栏,但是我也必须复制形状类型设置代码.
在任何一种情况下,我也冒着菜单设置的一个按钮,设置一个菜单项,设置一个按钮,广告infintum.
解决这个问题的最好办法是什么?
(Bonus积分能够解决Netbeans GUI设计师的问题;这更容易)
解决方法
如
How to Use Actions所述,
Action
接口是一种有效的方法“如果您有两个或更多个执行相同功能的组件”.特别是,Action
将允许您的按钮和菜单项使用相同的代码.
附录:下面的示例显示了JMenu和JToolBar如何可以为多个文件中的每一个共享相同的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 https://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; } }