有时候,我们会有这么一种需求:在一个程序中两个位置有一种相同功能的组件,当我们改变其中一个组件的状态时,另一个组件的状态也需要随之改变。例如,在word中点击右键有复制,粘贴的功能,在菜单栏中的某个位置也有复制,粘贴的功能,当我们右键复制,然后可以通过菜单栏中的粘贴把结果显示,又或者通过菜单栏的复制,右键粘贴结果。大概意思就是这样了。下面讲解具体实现。
步骤如下:
1.定义一个Action类,继承于AbstractAction,并重写其中的actionPerformed方法
2.使用该类定义一个Action对象。
3.
在所有需要相同功能的组件中,通过构造方法或者
setAction
,与该
Action
对象进行绑定。
下面将通过代码实现上述过程:
此时右键和菜单都实现了复制粘贴功能,并且实现了两个组件的绑定,当其中一个组件的状态改变时,另一个组件的状态也随之改变,效果这里就不便演示了。另外再附上一种写法,这种是使用匿名类的方法实现,并没有重新写类继承AbstractAction类,个人更倾向于使用这种方法,但是实现的功能一样。
下面将通过代码实现上述过程:
/**
*继承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();
}
}