Swing JTextArea 에서 라인 교환(줄바꿈)
alt+위방향키(alt+↑)를 누르면 현재 라인과 위 라인이 교환되고, alt+아래방향키(alt+↓)를 누르면 현재 라인과 아래 라인이 교환되는 메소드를 만들었다. exchangeTxt(String txt, int o1, int o2, int n1, int n2)이다. 우선 txt에 전체 텍스트, o1과 o2에는 텍스트 일부(A)의 처음과 끝 지점, n1고 n2에는 다른 텍스트 일부(B)의 처음과 끝 지점을 쓰면 나머지 텍스트는 그대로인채 A 부분과 B 부분이 바뀐다.

package com;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.text.BadLocationException;
public class MainClass{
public static void main(String[] args) {
MainForm mf=new MainForm();
}
}
class MainForm extends JFrame{
public String exchangeTxt(String txt, int o1, int o2, int n1, int n2){
//old->new
StringBuffer oldt=new StringBuffer(txt);
StringBuffer newt=new StringBuffer();
newt.append(oldt.substring(0,o1));
newt.append(oldt.substring(n1,n2));
if(!newt.substring(newt.length()-1).equals(“\n”)){
newt.append(“\n”);
System.out.println(“마지막줄이므로 \\n추가“);
}
newt.append(oldt.substring(o1,o2));
newt.append(oldt.substring(n2));
return newt.toString().trim();
}
JTextArea jta;
public MainForm() {
jta=new JTextArea();
jta.setBackground(Color.white);
jta.setBounds(10, 10, 260, 300);
jta.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
//Alt+아래 화살표키
if(e.isAltDown() && e.getKeyCode()==40){
try {
//현재 커서가 위치한 곳이 몇 번째 줄인지 알아내기
int line=jta.getLineOfOffset(jta.getCaretPosition());
if(line<jta.getLineCount()-1){
//현재 라인: 현재 커서가 있는 라인의 처음부터 끝까지를 자름
int start=jta.getLineStartOffset(line);
int end=jta.getLineEndOffset(line);
//다음 라인: 다음 줄의 처음부터 끝까지를 자름
int start2=jta.getLineStartOffset(line+1);
int end2=jta.getLineEndOffset(line+1);
//현재라인과 다음라인을 교체함
jta.setText(exchangeTxt(jta.getText(), start, end, start2, end2));
//다음 라인(line+1) 끝에 커서를 위치함 (마지막에 -1을 하는 이유는 마지막 부분이 \n이기 때문
jta.setCaretPosition(jta.getLineEndOffset(line+1)-1);
}
else{
System.out.println(“가장 아랫줄입니다”);
}
} catch (BadLocationException e1) {e1.printStackTrace();}
//Alt+위 화살표키
}else if(e.isAltDown() && e.getKeyCode()==38){
try {
//현재 커서가 위치한 곳이 몇 번째 줄인지 알아내기
int line=jta.getLineOfOffset(jta.getCaretPosition());
if(line>0){
//이전 라인: 현재 커서가 있는 라인 바로 이전 라인의 처음부터 끝까지를 자름
int start=jta.getLineStartOffset(line-1);
int end=jta.getLineEndOffset(line-1);
//현재 라인: 현재 커서가 있는 라인의 처음부터 끝까지를 자름
int start2=jta.getLineStartOffset(line);
int end2=jta.getLineEndOffset(line);
//이전라인과 현재라인을 교체함
jta.setText(exchangeTxt(jta.getText(), start, end, start2, end2));
//이전 라인(line-1) 끝에 커서를 위치함 (마지막에 -1을 하는 이유는 마지막 부분이 \n이기 때문
jta.setCaretPosition(jta.getLineEndOffset(line-1)-1);
}
else{
System.out.println(“가장 윗줄입니다”);
}
} catch (BadLocationException e1) {e1.printStackTrace();}
}
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
});
getContentPane().setLayout(null);
setSize(300,400);
getContentPane().add(jta);
setVisible(true);
}
}