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) {}
	}
}

 

你可能感兴趣的:(java)