代码之家  ›  专栏  ›  技术社区  ›  Austin Hyde

Swing:链接切换按钮和按钮组,以及相应的菜单项

  •  12
  • Austin Hyde  · 技术社区  · 15 年前

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

    每种形状的菜单项。

    我想把纽扣做得更高一点 JToggleButtons JRadioButtonMenuItems . 此外,我希望这样,当您选择一个工具栏按钮时,它将取消选择其他按钮,选择适当的菜单项,并取消选择其他菜单项。与选择菜单项相同。

    我知道我可以把任何 AbstractButton ButtonGroup ,但我不确定这是否是正确的方法,因为尽管它处理一个“组”按钮很好,但我不确定它是否可以处理两个并行组。

    在没有 钮扣组

    我也可以做两个 s、 一个用于菜单,一个用于工具栏,但我还必须复制形状类型设置代码。

    在这两种情况下,我还冒着菜单设置按钮设置菜单项设置按钮的风险。

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

    (能够使用Netbeans GUI设计器解决问题的好处是;它更简单)

    1 回复  |  直到 13 年前
        1
  •  18
  •   trashgod    15 年前

    这个 Action How to Use Actions . 尤其是 行动

    附录:下面的示例显示了 JMenu 以及 JToolBar 可以共享相同的 行动

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