/**
* 自定義的,可選中json字符串的 TextArea
* @author Administrator
*
*/
public class JsonTextArea extends JTextArea implements CaretListener{
/**
*
*/
private static final long serialVersionUID = 1L;
public JsonTextArea() {
invokeAddCaretListener();
}
/**
* 調用添加caret 監聽器
*/
private void invokeAddCaretListener() {
if(super.getCaretListeners() == null || super.getCaretListeners().length == 0)
this.addCaretListener(this);
}
/**
* 捕獲caret事件,單擊TextArea中的內容時會觸發, 主要實現了點擊時,選中json字符串
*/
@Override
public void caretUpdate(CaretEvent e) {
//因爲caretUpdate方法內部的一些操作也會觸發CaretEvent事件,產生遞歸調用,爲防止這種情況,暫時刪除Caret監聽器,在結尾處重新添加
this.removeCaretListener(this);
try {
int offset = e.getDot() ; //獲得插入符的位置。
//將組件文本中的偏移量轉換爲行號
int row = getLineOfOffset(offset);
//getLineStartOffset(int line) 取得給定行起始處的偏移量。
//getLineEndOffset(int line) 取得給定行結尾處的偏移量。
//int column = e.getDot() - getLineStartOffset(row);
// 在狀態欄中顯示當前光標所在行號、所在列號
String line = getLine(row);
int start = getLineStartOffset(row);
int end = getLineStartOffset(row) + line.length();
int tmpStart = line.indexOf("{");
if(tmpStart >= 0) {
String jsonString = line.substring(tmpStart);
try {
JSONUtil.parseToJson(jsonString);
start += tmpStart;
}
catch(Exception e1) {}
}
setSelectionStart(start);
setSelectionEnd(end);
final JScrollPane scrollPane = (JScrollPane)getParent().getParent();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
scrollPane.getHorizontalScrollBar().setValue(0);
}
});
} catch (Exception ex) {
}
this.addCaretListener(this);
}
/**
* 取得某行的字符串
* @param row 行號
* @return
*/
public String getLine(int row) {
String text = super.getText();
String[] arr = text.split("\r\n");
return arr[row];
}
/**
* 重寫append方法,當向TextArea添加數據時,垂直滾動條拉到最下方
*/
@Override
public void append(String str) {
super.append(str);
try {
final JScrollPane scrollPane = (JScrollPane)getParent().getParent();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
scrollPane.getVerticalScrollBar().setValue(Integer.MAX_VALUE);
}
});
}catch(Exception e) {}
}
}