后续实现剪切、复制、粘贴、删除需要用到的各个组件定义如下
JTextArea jtext = new JTextArea();//文本区域
//系统剪贴板
Toolkit toolkit=Toolkit.getDefaultToolkit(); //得到工具箱
Clipboard clipBoard=toolkit.getSystemClipboard();//从工具箱中获得系统剪贴板
JMenu jm_edit = new JMenu("编辑(E)");//编辑菜单
JMenuItem edit_cut = new JMenuItem("剪切(T)");//编辑菜单下的菜单子项
JMenuItem edit_copy = new JMenuItem("复制(C)");
JMenuItem edit_paste = new JMenuItem("粘贴(P)");
JMenuItem edit_delete = new JMenuItem("删除(L)");
为编辑菜单添加菜单监听器,判断剪切、复制、粘贴、删除这些功能在各种情况下是否可用
jm_edit.addMenuListener(new MenuListener()
{ public void menuCanceled(MenuEvent e)//取消菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
public void menuDeselected(MenuEvent e)//取消选择某个菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
public void menuSelected(MenuEvent e)//选择某个菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
});
判断功能可用性的函数定义如下
//设置菜单子项的可用性:剪切,复制,粘帖,删除功能
void checkMenuItemEnabled()
{ String selectText=jtext.getSelectedText();//获取文本区域文本
if(selectText==null)//文本区域为空,不能剪切、复制、删除
{ edit_cut.setEnabled(false);
edit_copy.setEnabled(false);
edit_delete.setEnabled(false);
}
else//非空即可
{ edit_cut.setEnabled(true);
edit_copy.setEnabled(true);
edit_delete.setEnabled(true);
}
//粘帖功能可用性判断
Transferable contents=clipBoard.getContents(MyNotepad.this);//获取系统剪贴板内容
if(contents==null)//空板子粘贴不了
edit_paste.setEnabled(false);
else
edit_paste.setEnabled(true);
}
关于系统剪贴板:只有一种类型的数据可以复制到剪贴板或者从剪贴板中取出,即 Transferable对象。
剪切功能的实现:
jtext.requestFocus();//把输入焦点放在文本区域上
String text=jtext.getSelectedText();//获取选中的文本内容
//StringSelection实现的所有接口ClipboardOwner和Transferable
StringSelection selection=new StringSelection(text);
clipBoard.setContents(selection,null);//将选中内容放入剪贴板
jtext.replaceRange("",jtext.getSelectionStart(),jtext.getSelectionEnd());//空字符替换选中文本
checkMenuItemEnabled();//判断剪切,复制,粘帖,删除功能的可用性
复制功能的实现:剪切功能不用空字符替代选中文本
jtext.requestFocus();
String text=jtext.getSelectedText();
StringSelection selection=new StringSelection(text);
clipBoard.setContents(selection,null);
checkMenuItemEnabled();//设置剪切,复制,粘帖,删除功能的可用性
粘贴功能:
jtext.requestFocus();
//只有一种类型的数据可以复制到剪贴板或者从剪贴板中取出,即Transferable对象。
Transferable contents=clipBoard.getContents(this);
if(contents==null)//空板子
return;
String text="";
try
{
//getTransferData返回一个对象,该对象表示将要被传输的数据。
//返回对象的类是由该 flavor 的表示类定义的
//DataFlavor.stringFlavor:表示 Java Unicode 字符类
text=(String)contents.getTransferData(DataFlavor.stringFlavor);
}
catch (Exception exception)//捕获到异常可以啥也不干,但是不写就报错…………
{
}
//用剪贴板内容替换选中文本,未选中就是插入光标所在位置
jtext.replaceRange(text,jtext.getSelectionStart(),jtext.getSelectionEnd());
checkMenuItemEnabled();
删除功能:用空字符替代选中文本,和按DELETE键效果一样
jtext.requestFocus();
jtext.replaceRange("",jtext.getSelectionStart(),jtext.getSelectionEnd());
checkMenuItemEnabled(); //设置剪切、复制、粘贴、删除等功能的可用性
如有错误,欢迎指正。