/**
* 自定义的,可选中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) {}
}
}