天天看點

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