有時候,我們會有這麼一種需求:在一個程式中兩個位置有一種相同功能的元件,當我們改變其中一個元件的狀态時,另一個元件的狀态也需要随之改變。例如,在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();
}
}