JTextArea實現類似JList那樣的效果


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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章