JTextArea 上移一行 下移一行 的 实现

上移一行:

 

/**
	 * 上移一行
	 */
	private void moveUp(){
		
		//获得选中文本
		String selection = jTextArea1.getSelectedText();

		//没有选中文本的场景
		if (selection == null) {
			try {
				//获得当前光标位置
				int cur = jTextArea1.getCaretPosition();
				//取得当前行行号
	            int row = jTextArea1.getLineOfOffset(cur);
				if(row == 0){
					return ;//如果当前行是第一行,则return
				}
				//取得当前行的起始位置
				int lineStartOffset = jTextArea1.getLineStartOffset(row);
				//取得当前行结束位置
				int lineEndOffset = jTextArea1.getLineEndOffset(row);
				//取得当前行的内容
				String lineText = jTextArea1.getText(lineStartOffset, lineEndOffset-lineStartOffset);
				
				//取得上一行的起始位置
				int upLineStartOffset = jTextArea1.getLineStartOffset(row-1);
				//取得上一行的结束位置
				int upLineEndOffset = jTextArea1.getLineEndOffset(row-1);
				//取得上一行的内容
				String upLineText = jTextArea1.getText(upLineStartOffset, upLineEndOffset-upLineStartOffset);
				
				//对于当前行不是以换行符结尾场景的特殊处理
				if(!lineText.endsWith("\n")){
					lineText = lineText+"\n";
					upLineText = upLineText.substring(0, upLineText.length()-1);
				}
				
				//删除当前行内容
				jTextArea1.replaceRange(null, lineStartOffset, lineEndOffset);
				//将上一行的内容插入当前行的起始位置
				jTextArea1.insert(upLineText, lineStartOffset);
				
				//删除上一行内容
				jTextArea1.replaceRange(null, upLineStartOffset, upLineEndOffset);
				//将当前行的内容插入上一行的起始位置
				jTextArea1.insert(lineText, upLineStartOffset);
				
				//将新上移的行选中,以便于识别。
				//当前行上移后,新的上一行起始位置不会变化,但是结束位置会发生变化,所以需要重新获取结束位置。
				jTextArea1.setSelectionStart(upLineStartOffset);
				//结束位置做减一处理,是为了防止光标所在行与当前选中行不一致(结束位置是换行符)
				jTextArea1.setSelectionEnd(jTextArea1.getLineEndOffset(row-1)-1);
			} catch (Exception e) {
				if("true".equals(ConfigUtil.getConfInfo().get(Const.IS_LOG)+"")){				
					log.error(null, e);
				}
			}
		}else {
			try {
				//取得选中行的起始行号
				int startRow = jTextArea1.getLineOfOffset(jTextArea1.getSelectionStart());
				if(startRow == 0){
					return ;
				}
				//取得选中行的结束行号
				int endRow = jTextArea1.getLineOfOffset(jTextArea1.getSelectionEnd());
				//取得选中行的起始位置
				int startCur = jTextArea1.getLineStartOffset(startRow);
				//取得选中行的结束位置
				int endCur = jTextArea1.getLineEndOffset(endRow);
				//取得当前选择行的内容
				String text = jTextArea1.getText(startCur,endCur-startCur);
				//取得上一行的起始位置
				int upLineStartOffset = jTextArea1.getLineStartOffset(startRow-1);
				//取得上一行的结束位置
				int upLineEndOffset = jTextArea1.getLineEndOffset(startRow-1);
				//取得上一行的内容
				String upLineText = jTextArea1.getText(upLineStartOffset, upLineEndOffset-upLineStartOffset);
				
				//对于当前所选行不是以换行符结尾场景的特殊处理
				if(! text.endsWith("\n")){
					text = text+"\n";
					upLineText = upLineText.substring(0, upLineText.length()-1);
				}
				
				//删除选中行内容
				jTextArea1.replaceRange(null, startCur, endCur);
				//将上一行的内容插入当前行的起始位置
				jTextArea1.insert(upLineText, startCur);
				
				//删除上一行内容
				jTextArea1.replaceRange(null, upLineStartOffset, upLineEndOffset);
				//将当前行的内容插入上一行的起始位置
				jTextArea1.insert(text, upLineStartOffset);
				
				//将新上移的行选中,以便于识别。
				//当前行上移后,新的上一行起始位置不会变化,但是结束位置会发生变化,所以需要重新获取结束位置。
				jTextArea1.setSelectionStart(upLineStartOffset);
				//结束位置做减一处理,是为了防止光标所在行与当前选中行不一致(结束位置是换行符)
				jTextArea1.setSelectionEnd(jTextArea1.getLineEndOffset(endRow-1)-1);
			} catch (Exception e) {
				if("true".equals(ConfigUtil.getConfInfo().get(Const.IS_LOG)+"")){				
					log.error(null, e);
				}
			}
		}
	}

 

下移一行:

 

/**
	 * 下移一行
	 */
	private void moveDown(){
		
		//获得选中文本
		String selection = jTextArea1.getSelectedText();

		//没有选中文本的场景
		if (selection == null) {
			try {
				//获得当前光标位置
				int cur = jTextArea1.getCaretPosition();
				//取得当前行行号
	            int row = jTextArea1.getLineOfOffset(cur);
	            //取得最后一行的行号
	            int endRow = jTextArea1.getLineCount()-1;
	            //如果当前行是最后一行,则return
				if(row == endRow){
					return ;
				}
				//取得当前行的起始位置
				int lineStartOffset = jTextArea1.getLineStartOffset(row);
				//取得当前行结束位置
				int lineEndOffset = jTextArea1.getLineEndOffset(row);
				//取得当前行的内容
				String lineText = jTextArea1.getText(lineStartOffset, lineEndOffset-lineStartOffset);
				
				//取得下一行的起始位置
				int nextLineStartOffset = jTextArea1.getLineStartOffset(row+1);
				//取得下一行的结束位置
				int nextLineEndOffset = jTextArea1.getLineEndOffset(row+1);
				//取得下一行的内容
				String nextLineText = jTextArea1.getText(nextLineStartOffset, nextLineEndOffset-nextLineStartOffset);
				
				//对于下一行不是以换行符结尾场景的特殊处理
				boolean isEndN = nextLineText.endsWith("\n");
				if(!isEndN){
					nextLineText = nextLineText+"\n";
					lineText = lineText.substring(0, lineText.length()-1);
				}
				
				//删除下一行内容
				jTextArea1.replaceRange(null, nextLineStartOffset, nextLineEndOffset);
				//将当前行的内容插入下一行的起始位置
				jTextArea1.insert(lineText, nextLineStartOffset);
				
				//删除当前行内容
				jTextArea1.replaceRange(null, lineStartOffset, lineEndOffset);
				//将下一行的内容插入当前行的起始位置
				jTextArea1.insert(nextLineText, lineStartOffset);

				//将新下移的行选中,以便于识别。
				//当前行下移后,新的下一行起始位置会发生变化,所以需要重新获取结束位置。
				jTextArea1.setSelectionStart(jTextArea1.getLineStartOffset(row+1));
				//(下移后结束位置不会发生变化)结束位置做减一处理,是为了防止光标所在行与当前选中行不一致(结束位置是换行符)
				if(isEndN){
					jTextArea1.setSelectionEnd(nextLineEndOffset-1);
				}else{
					jTextArea1.setSelectionEnd(nextLineEndOffset);
				}
			} catch (Exception e) {
				if("true".equals(ConfigUtil.getConfInfo().get(Const.IS_LOG)+"")){				
					log.error(null, e);
				}
			}
		}else {
			try {
				//取得选中行的起始行号
				int startRow = jTextArea1.getLineOfOffset(jTextArea1.getSelectionStart());
				//取得选中行的结束行号
				int endRow = jTextArea1.getLineOfOffset(jTextArea1.getSelectionEnd());
				//取得最后一行的行号
	            int lastRow = jTextArea1.getLineCount()-1;
	            //如果选中行的最后一行是文本域的最后一行,则return
				if(endRow == lastRow){
					return ;
				}
				//取得选中行的起始位置
				int startCur = jTextArea1.getLineStartOffset(startRow);
				//取得选中行的结束位置
				int endCur = jTextArea1.getLineEndOffset(endRow);
				//取得当前选择行的内容
				String text = jTextArea1.getText(startCur,endCur-startCur);
				//取得下一行的起始位置
				int nextLineStartOffset = jTextArea1.getLineStartOffset(endRow+1);
				//取得下一行的结束位置
				int nextLineEndOffset = jTextArea1.getLineEndOffset(endRow+1);
				//取得下一行的内容
				String nextLineText = jTextArea1.getText(nextLineStartOffset, nextLineEndOffset-nextLineStartOffset);
				
				//对于下一行不是以换行符结尾场景的特殊处理
				boolean isEndN = nextLineText.endsWith("\n");
				if(!isEndN){
					nextLineText = nextLineText+"\n";
					text = text.substring(0, text.length()-1);
				}
				
				//删除下一行内容
				jTextArea1.replaceRange(null, nextLineStartOffset, nextLineEndOffset);
				//将选中行内容插入下一行的起始位置
				jTextArea1.insert(text, nextLineStartOffset);
				
				//删除选中行内容
				jTextArea1.replaceRange(null, startCur, endCur);
				//将下一行的内容插入选中行的起始位置
				jTextArea1.insert(nextLineText, startCur);
				
				//将新下移的行选中,以便于识别。
				//选中行下移后,起始位置会发生变化,但是结束位置不会发生变化,所以需要重新获取起始位置。
				jTextArea1.setSelectionStart(jTextArea1.getLineStartOffset(startRow+1));
				//(下移后结束位置不会发生变化)结束位置做减一处理,是为了防止光标所在行与当前选中行不一致(结束位置是换行符)
				if(isEndN){
					jTextArea1.setSelectionEnd(nextLineEndOffset-1);
				}else{
					jTextArea1.setSelectionEnd(nextLineEndOffset);
				}
			} catch (Exception e) {
				if("true".equals(ConfigUtil.getConfInfo().get(Const.IS_LOG)+"")){				
					log.error(null, e);
				}
			}
		}
	}

你可能感兴趣的:(JTextArea)