본문 바로가기

Subject/Programming

JAVA] JFrame을 이용한 메모장 - 3) 단추(new, open, ...) 기능 구현

0. ActionListener 인터페이스 


 -버튼이 클릭되었을 때, 그에 따른 코드가 실행되게 구현 가능.

 -구성

  1) 프레임 클래스 내에 MyEventListener(implement Action Listener) 이너클래스 구현.

     > void actionPerformed(ActionEvent e) 오버라이딩 메소드 구현 //이벤트 발생시 실질적으로 호출되는 메소드

 

  2) 원하는 버튼에 MyEventListener 클래스 객체를 등록 

      > menuItemNew.addActionListener(new MyEventListener());

 

  3) 버튼 클릭시 MyEventListener::void actionPerformed(ActionEvent e)가 호출

   >ActionEvent e: 발생한 이벤트 값

     >> 조건문으로 e를 확인하여 관련된 코드를 실행




1. New 기능 만들기(새 글)


 

//MyNoteFrame 생성자

{

addEventListener(); //이벤트 리스너 등록 메소드 호출

}  



//addEventListener() 메소드

menuItemNew.addActionListener(new MyEventListener()); //New 버튼에 이벤트 처리를 위한 클래스 객체 등록



//MyEventListener 클래스

class MyNoteFrame

{

class MyEventListener implement ActionListener

{

@Override   

public void actionPerformed(ActionEvent e) 

{

// TODO Auto-generated method stub

Object o = e.getSource();

if(o == menuItemNew || o == toolNew)  //발생한 이벤트가 menu의 New단추이거나 (이미지버튼인)toolNew이면 {

this.newDocument(); //new에 관련된 코드가 담긴 newDocument() 실행

}

}

}//class MyEventListener

}//class MyNoteFrame



//newDocument() 메소드

public void newDocument()

{

this.checkRemindData();//작업중인 데이터가 남아있을 때 저장여부 확인


textArea.setText(""); //텍스트 창을 초기화

textArea.requestFocus(); //커서를 깜빡임(중요하지 않음)

}



//checkRemindData() 메소드

public void checkRemindData()

{

int ret;

//save

if(!textArea.getText().equals("")) //현재 텍스트창이 공백이 아니라면(작업 데이터가 남아있다면)

{

ret = JOptionPane.showConfirmDialog(MyNoteFrame.this, "작업 내용이 남아있습니다. \n저장하시겠습니까?");

if(ret == JOptionPane.YES_OPTION)  //클릭한 버튼이 YES라면

{

if(this.saveDocument() == false)

return ;

}

}//save if

}


        -JOptionPane.showConfirmDialog(MyNoteFrame.this, "작업 내용이 남아있습니다. \n저장하시겠습니까?");

         :MyNoteFrame에 소속되는, '예/아니오/취소' 버튼이 담긴 메시지창을 띄움.

          >클릭한 버튼 정보는 반환됨.

          

          >메시지창 모습




2.Open 기능 구현(저장된 텍스트 파일의 내용을 불러옴)


//리스너 등록 부분은 모두 동일하므로 생략

{

/* 생....략 */

}



//openDocument()

{

 checkRemindData(); //작업중인 데이터 남아있는지 Save 여부(이하 생략)

//open

JFileChooser openChooser = new JFileChooser(); 

int ret = openChooser.showOpenDialog(MyNoteFrame.this); // 탐색기에서 파일을 고를 수 있는 메시지창이 생성됨.

if(ret == JFileChooser.APPROVE_OPTION)

{

File file = openChooser.getSelectedFile(); //선택한 파일정보를 불러옴.

try {

Scanner sc = new Scanner(file);  //

String txt = "";

StringBuilder sb = new StringBuilder(txt);

while(sc.hasNextLine())

{

sb.append(sc.nextLine() + "\n");


}

txt = sb.toString();

textArea.setText(txt);

/* 혹은 textArea.setText(""); textArea.append(sc.nextLine() + "\n")l; 로 대체 가능 */


} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}//open if

}


 >JFileChooser::showOpenDialog() 메시지 창




3.Save 기능


//boolean saveDocument() 메소드

{


JFileChooser saveChooser = new JFileChooser();

int ret = saveChooser.showSaveDialog(MyNoteFrame.this);  //save 파일 선택창이 나타남.

if(ret == JFileChooser.APPROVE_OPTION)

{

File tempFile = saveChooser.getSelectedFile();

String saveFilePath = tempFile.getPath();

PrintWriter fw;

try {

fw = new PrintWriter(new File(saveFilePath+".txt"));  //txt확장자 자동 생성

fw.write(textArea.getText());  

fw.flush(); //파일 버퍼에 저장된 것을 파일에 보냄(저장)

fw.close(); //파일 스트림 종료

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return true;

}//if

return false;

}


 >JFileChooser::showSaveDialog() 메시지 창





4.Exit 기능 구현(프로그램 종료)


//리스너 등록



//exitDocument

{

checkRemindData();


MyNoteFrame.this.dispose(); // JFrame 메모리 해제 

System.exit(0); //프로세스 종료

}


>Inner 클래스에서 Outter 클래스 멤버 접근 방법

 Outter Class Name.this.member