Swing学习----------实现多个组件的绑定

来源:互联网 发布:mac最好的播放器 编辑:程序博客网 时间:2024/06/06 04:09

         有时候,我们会有这么一种需求:在一个程序中两个位置有一种相同功能的组件,当我们改变其中一个组件的状态时,另一个组件的状态也需要随之改变。例如,在word中点击右键有复制,粘贴的功能,在菜单栏中的某个位置也有复制,粘贴的功能,当我们右键复制,然后可以通过菜单栏中的粘贴把结果显示,又或者通过菜单栏的复制,右键粘贴结果。大概意思就是这样了。下面讲解具体实现。

         步骤如下:

               1.定义一个Action类,继承于AbstractAction,并重写其中的actionPerformed方法              

         2.使用该类定义一个Action对象。
          3.在所有需要相同功能的组件中,通过构造方法或者setAction,与该Action对象进行绑定。

        下面将通过代码实现上述过程:
/** *继承AbstractActio的版本 */public class Menu2 {JFrame frm;JTextArea area;JScrollPane sp;JMenuBar menubar;JPopupMenu popupmenu;CopyAction copyaction;PasteAction pasteaction;JMenu filemenu,editmenu;JMenuItem open,save,copy,paste;public Menu2(){frm=new JFrame("菜单");frm.setSize(240, 180);frm.setLayout(null);area=new JTextArea();sp=new JScrollPane(area);sp.setBounds(0, 0, 240, 180);area.addMouseListener(new MouseAdapter(){public void mouseReleased(MouseEvent e){if(e.isPopupTrigger())popupmenu.show(area, e.getX(), e.getY());}});menubar=new JMenuBar();frm.setJMenuBar(menubar);filemenu=new JMenu("文件");open=new JMenuItem("打开");save=new JMenuItem("保存");editmenu=new JMenu("编辑");copy=new JMenuItem("复制");paste=new JMenuItem("粘贴");menubar.add(filemenu);filemenu.add(open);filemenu.addSeparator();filemenu.add(save);menubar.add(editmenu);editmenu.add(copy);editmenu.addSeparator();editmenu.add(paste);popupmenu=new JPopupMenu();JMenuItem c=new JMenuItem("复制");JMenuItem p=new JMenuItem("粘贴");popupmenu.add(c);popupmenu.addSeparator();popupmenu.add(p);/** * 此处要注意要new一个示例空间,否则copyaction对象和pasteaction对象没有指向 * 任何实例空间 */copyaction=new CopyAction();pasteaction=new PasteAction();/** * 四个组件都要绑定action */copy.setAction(copyaction);c.setAction(copyaction);paste.setAction(pasteaction);p.setAction(pasteaction);frm.add(sp);frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.setVisible(true);}class CopyAction extends AbstractAction{/** * 注意此处是显示绑定的组件的标题,不写这个会导致组件没有名字 */public CopyAction(){super("复制");}public void actionPerformed(ActionEvent e){area.copy();}}class PasteAction extends AbstractAction{public PasteAction(){super("粘贴");}public void actionPerformed(ActionEvent e){area.paste();}}public static void main(String[] args) {new Menu2();}}

       此时右键和菜单都实现了复制粘贴功能,并且实现了两个组件的绑定,当其中一个组件的状态改变时,另一个组件的状态也随之改变,效果这里就不便演示了。另外再附上一种写法,这种是使用匿名类的方法实现,并没有重新写类继承AbstractAction类,个人更倾向于使用这种方法,但是实现的功能一样。
    
public class MyMenu1 {JFrame frm;JTextArea area;JScrollPane sp;JMenuBar menubar;JPopupMenu popupmenu;JMenu filemenu,editmenu;JMenuItem open,save,copy,paste;private AbstractAction copyAciton;private AbstractAction pasteAction;public MyMenu1(){frm=new JFrame("菜单");frm.setSize(240, 180);frm.setLayout(null);area=new JTextArea();sp=new JScrollPane(area);sp.setBounds(0, 0, 240, 180);area.addMouseListener(new MouseAdapter(){public void mouseReleased(MouseEvent e){if(e.isPopupTrigger())popupmenu.show(area, e.getX(), e.getY());}});menubar=new JMenuBar();frm.setJMenuBar(menubar);filemenu=new JMenu("文件");open=new JMenuItem("打开");save=new JMenuItem("保存");editmenu=new JMenu("编辑");copy=new JMenuItem("复制");paste=new JMenuItem("粘贴");menubar.add(filemenu);filemenu.add(open);filemenu.addSeparator();filemenu.add(save);menubar.add(editmenu);editmenu.add(copy);editmenu.addSeparator();editmenu.add(paste);popupmenu=new JPopupMenu();JMenuItem c=new JMenuItem("复制");JMenuItem p=new JMenuItem("粘贴");popupmenu.add(c);popupmenu.addSeparator();popupmenu.add(p);copyAciton=new AbstractAction("复制"){public void actionPerformed(ActionEvent e){area.copy();}};pasteAction=new AbstractAction("粘贴"){public void actionPerformed(ActionEvent e){area.paste();}};paste.setAction(pasteAction);copy.setAction(copyAciton);p.setAction(pasteAction);c.setAction(copyAciton);frm.add(sp);frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.setVisible(true);}public static void main(String[] args) {new MyMenu1();}}


原创粉丝点击