Java 1.1对系统剪贴板提供有限的操纵支持(在Java.awt.datatransfer package里)。我们可以将字符串作这文字工具复制到剪贴板中,而且我们可以从剪贴板中粘贴文字到字符中对角中。虽然,剪贴板被设计来容纳各类范例的数据,存在于剪贴板上的数据通过措施运行剪切和粘贴进入到措施中。固然剪切板今朝只支持字符串数据,Java的剪切板API通过“特色”观念提供了精采的可扩展性。当数据从剪贴板中出来时,它拥有一个相关的特色集,这个特色集可以被修改(譬喻,一个图形可以被暗示成一些字符串可能一幅图像)而且我们会留意到假如非凡的剪贴板数据支持这种特色,我们会对此十分的感乐趣。
下面的措施简朴地对TextArea中的字符串数据举办剪切,复制,粘贴的操纵做了示范。我们将留意到的是我们需要凭据剪切、复制和粘贴的顺序举办事情。但假如我们瞥见一些其它措施中的TextField可能TextArea,我们会发明它们同样也自动地支持剪贴板的操纵顺序。措施中简朴地增加了剪贴板的措施化节制,假如我们想用它来捕获剪贴板上的文字到一些非文字组件中就可以利用这种技能。
//: CutAndPaste.java // Using the clipboard from Java 1.1 import java.awt.*; import java.awt.event.*; import java.awt.datatransfer.*; public class CutAndPaste extends Frame { MenuBar mb = new MenuBar(); Menu edit = new Menu("Edit"); MenuItem cut = new MenuItem("Cut"), copy = new MenuItem("Copy"), paste = new MenuItem("Paste"); TextArea text = new TextArea(20,20); Clipboard clipbd = getToolkit().getSystemClipboard(); public CutAndPaste() { cut.addActionListener(new CutL()); copy.addActionListener(new CopyL()); paste.addActionListener(new PasteL()); edit.add(cut); edit.add(copy); edit.add(paste); mb.add(edit); setMenuBar(mb); add(text, BorderLayout.CENTER); } class CopyL implements ActionListener { public void actionPerformed(ActionEvent e) { String selection = text.getSelectedText(); StringSelection clipString = new StringSelection(selection); clipbd.setContents(clipString, clipString); } } class CutL implements ActionListener { public void actionPerformed(ActionEvent e) { String selection = text.getSelectedText(); StringSelection clipString = new StringSelection(selection); clipbd.setContents(clipString, clipString); text.replaceRange("", text.getSelectionStart(), text.getSelectionEnd()); } } class PasteL implements ActionListener { public void actionPerformed(ActionEvent e) { Transferable clipData = clipbd.getContents(CutAndPaste.this); try { String clipString = (String)clipData. getTransferData( DataFlavor.stringFlavor); text.replaceRange(clipString, text.getSelectionStart(), text.getSelectionEnd()); } catch(Exception ex) { System.out.println("not String flavor"); } } } public static void main(String[] args) { CutAndPaste cp = new CutAndPaste(); cp.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); cp.setSize(300,200); cp.setVisible(true); } } ///:~
建设和增加菜单及TextArea到如今好像已酿成一种单调的勾当。这与通过东西组件建设的剪贴板字段clipbd有很大的区别。
所有的行动都安放在吸收器中。CopyL和Cupl吸收器同样除了最后的CutL线以外删除被复制的线。非凡的两条线是StringSelection工具从字符串从建设并挪用StringSelection的setContents()要领。说得更精确些,就是放一个字符串到剪切板上。
在PasteL中,数据被剪贴板操作getContents()举办解析。任何返回的工具都是可移动的匿名的,而且我们并不真正地知道它内里包括了什么。有一种发明的要领是挪用getTransferDateFlavors(),返回一个DataFlavor工具数组,表白非凡工具支持这种特点。我们同样能要求它通过我们感乐趣的特点直接地利用IsDataFlavorSupported()。可是在这里利用一种斗胆的要领:挪用getTransferData( )要领,假设内里的内容支持字符串特色,而且它不是个被分类在异常处理惩罚器中的困难 。
在未来,我们但愿更多的数据特色可以或许被支持。