天天看点

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

         有时候,我们会有这么一种需求:在一个程序中两个位置有一种相同功能的组件,当我们改变其中一个组件的状态时,另一个组件的状态也需要随之改变。例如,在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();
	}
}