Swing JTextArea 에서 라인 교환(줄바꿈)

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