記事本(含剪下、複製、貼上、全選、撤銷)核心設計
br.close();
對文字的編輯功能需要用到Clipboard類,也就是剪貼簿。通過clipboard = getToolkit().getSystemClipboard();獲取系統的剪貼簿,也就當系統剪貼簿上有內容的時候,同樣可以被用到自己編寫的記事本軟體中。複製操作,如下程式碼:
public void copy(){
//拖動選取文字
String temp = mf.body.getSelectedText();
//把獲取的內容複製到連續字元器,這個類繼承了剪貼簿介面
StringSelection text = new StringSelection(temp);
//把內容放在剪貼簿
mf.clipboard.setContents(text, null);
}
我的mf.body是指主只介面上的名字叫body的JTextArea控制元件。剪下內容跟複製類似,在複製的基礎之上再加三行程式碼:
//標記開始位置
int start = mf.body.getSelectionStart();
//標記結束位置
int end = mf.body.getSelectionEnd();
//刪除所選段
mf.body.replaceRange("", start, end);
最複雜的貼上來了,我看了一些人寫這個功能寫得很簡陋,還有bug,沒有考慮到當要貼上的時候滑鼠已經選中了一部分內容。當然,要貼上之前還是先要判斷一下剪貼簿裡面有沒有內容,如果沒有當然貼不出什麼東西。所以,我就把貼上這個功能寫成:
public void paste(){
//Transferable介面,把剪貼簿的內容轉換成資料
Transferable contents = mf.clipboard.getContents(this);
//DataFalvor類判斷是否能把剪貼簿的內容轉換成所需資料型別
DataFlavor flavor = DataFlavor.stringFlavor;
//如果可以轉換
if(contents.isDataFlavorSupported(flavor)){
String str;
try {//開始轉換
str=(String)contents.getTransferData(flavor);
//如果要貼上時,滑鼠已經選中了一些字元
if(mf.body.getSelectedText()!=null){
//定位被選中字元的開始位置
int start = mf.body.getSelectionStart();
//定位被選中字元的末尾位置
int end = mf.body.getSelectionEnd();
//把貼上的內容替換成被選中的內容
mf.body.replaceRange(str, start, end);
}else{
//獲取滑鼠所在TextArea的位置
int mouse = mf.body.getCaretPosition();
//在滑鼠所在的位置貼上內容
mf.body.insert(str, mouse);
}
} catch(UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch(IllegalArgumentException e){
e.printStackTrace();
}
}
}