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( )方法,假設裡面的內容支持字符串特色,並且它不是個被分類在異常處理器中的難題 。
在將來,我們希望更多的數據特色能夠被支持。