ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 텍스트 입력 창과 다이얼 로그 창 만들기
    JAVA/GUI - Frame 2020. 10. 1. 10:56

    문제

    MessageTest.java를 만들고 Message 클래스에 아래와 같이 디자인을 하도록 하자.

    Label, TextField, Button을

    GridLayout에 위치시키고 (메시지 : 텍스트필드, 아래쪽에 버튼)

    버튼을 눌렀을 때, 다이얼로그 창으로 글자 나타내기

    다이얼로그 닫기 버튼을 만들고 닫기 버튼을 클릭했을 때 다이얼로그 창 닫기

     

    예시

     

    위의 그림과 같이 창에 메시지를 입력하고 전송 버튼을 누르면 다이얼로그 창이 떠서

    입력한 메시지를 보여준다.

    그리고 다이얼 로그 창의 닫기 버튼을 누르면 다이얼로그는 사라진다.

    여기서 다이얼 로그 창이 사라진다라는 개념보다는 보여지다 사라지게 구현하자.

    윈도우 창과 다이얼 로그 창 모두 layout을 gridlayout을 적용해서 각 영역을 구분 짓도록 하자.

    꼭 gidlayout을 쓰지 않아도 된다.

     

    외형의 구현

    프로그램 실행결과

    위와 같이 두 창이 뜨면, 외형의 구현은 끝이다.

    그리고 다이얼 로그 창의 setVisible을 false로 세팅하자.

    소스 파일

    MessageTest.java
    0.00MB

     

    내부 구현

    우리가 내부적으로 구현해야 할 것은 입력 창에 글자를 입력하고 전송 버튼을 누르면 

    다이얼 로그 창이 떠서 입력 창에 입력된 내용이 다이얼 로그 창에 보여지도록 하는 것이다.

    그리고 다이얼 로그 창의 닫기 버튼을 누르면 다이얼 로그 창은 사라지도록 하는 것이다.

    이 내부 구현의 핵심은 버튼이 클릭됨을 감지하는 것이다.

    버튼의 감지 하는 부분의 구현 방식은 총 3가지로 할 수 있다.

    (1). 익명의 사용

    (2). 위의 Message 클래스에서 addLisnter 인터페이스를 상속 받아 actionPerformed 함수를 재정의

    (3). 별 개의 클래스를 만들어서 재정의

     

    내부 구현 - (1). 익명의 사용

    여기서는 익명을 사용해서 버튼의 감지를 구현하도록 한다.

    이 부분은 Message 클래스의 생성자에서 구현한다.

    버튼은 전송 버튼과 다이얼 로그 창의 닫기 버튼 총 2개이므로 이벤트 등록을 2개 해야 한다.

    버튼의 감지를 위해서는 위의 두 내용을 임포트 해야한다.

    아래는 두 버튼에 대해 이벤트 등록하는 부분이다.

    인터페이스 ActionListener에는 메소드가 actionPerformed가 하나 밖에 없다.

    만약에 인터페이스를 상속하게 될 경우에는 인터페이스에 있는 모든 메소드를 재정의 해야 한다.

    그 이유는 인터페이스에 정의된 메소드들은 모두 추상 메소드이기 때문이다.

     

    프로그램 실행결과

    입력 창에 다음과 같이 글을 입력한 후에 전송 버튼을 클릭하면

    아래의 그림을 보다시피 다이얼 로그 창이 뜨면서 입력한 내용이 나옴을 알 수 있다.

    다이얼 로그 창의 닫기 버튼을 눌러보자.

    아주 잘 작동한다.

     

    익명 소스 파일

    MessageTest.java
    0.00MB

     

    내부 구현 (2). 위의 Message 클래스에서 addLisnter 인터페이스를 상속 받아 actionPerformed 함수를 재정의

    Message 클래스에서 ActionListener 인터페이스를 상속 받는다.

    위에서 ActionListner 인터페이스에 정의된 추상 메소드를 정의 해야 한다.

    함수에 정의할 내용은 각 버튼이 눌렸을 때 수행할 내용이 들어가면 된다.

    그리고, 두 버튼에 대한 이벤트 등록은 Message 클래스의 생성자에서 한다.

    아래와 같다.

    위의 각 버튼들의 addActionListener함수의 매개변수는 ActionListener를 요구한다.

    Message가 클래스가 ActionListener를 상속받아 ActionListener의 추상 메소드들을

    재정의 했기 때문에 this를 넣어준다.

     

    내부 구현 (2). 소스 파일

    MessageTest.java
    0.00MB

     

    내부 구현 (3). 별 개의 클래스를 만들어서 재정의

    이건 (2)를 약간만 변형한 것으로 Message클래스가 ActionListener를 상속하지 않고

    별 개의 클래스를 생성해서 이 클래스가 각 버튼이 눌렸을 때에 해야할 일을 처리한다.

    각 버튼이 클릭될 때마다 해야할 작업들은 Message 객체를 가지고 해야하므로, 

    생성자에서 이 객체를 얻어와서 버튼이 클릭될 때마다 해야할 작업을 처리한다.

     

    위의 클래스에서 Message 클래스의 각 변수들을 접근하기 위해서는 

    그리고, Message 클래스의 변수들을 public으로 변경하도록 하자.

    그리고, 이벤트 등록하는 부분을 보자. Message 클래스의 생성자에서 한다.

    소스 파일

    MessageTest.java
    0.00MB

     

    실제로 여기까지만 하면 되지만, 한 가지 더 구현해볼 것이 있다.

    위의 텍스트 입력 창의 X버튼을 누르면 윈도우 창을 종료하는 기능이다.

    위의 창이 곧 Frame 이다. 

    그 이유는 텍스트 입력 창과 버튼을 Frame에 추가하였기 때문이다.

    그래서 위의 창에 대한 종료 버튼은 Frame 클래스의 Listener 함수를 이벤트 등록을 통해

    해야할 것임을 유추해 볼 수 있다.

    현재 내부 구현 (2)를 가지고 이 내용을 진행할 것이다.

    여기서 또한 세 가지 방식으로 이 종료 버튼을 구현할 수 있다.

    여기서는 Frame클래스에 addWindowListener함수로 종료 버튼을 에 대한 이벤트 등록을 한다.

    그리고 이 함수의 매개변수로는 WindowListener가 필요하다.

     

    구현할 방법은 위와 마찬가지로 3가지로 구현할 수 있다.

    (1). 위의 Message 클래스에서 WindowListener인터페이스를 상속 받아 windowClosing함수를 재정의

    (2). 별 개의 클래스를 만들어서 재정의

    (3). 익명의 사용

     

    이번에 구현 순서를 바꿔서 진행한다.

    여기서 우리가 한 가지 알아야 할 사실이 있다.

    WindowListener 인터페이스에는 추상 메소드가 하나가 아닌 6개 있다.

    이 인터페이스를 상속받으면 이 메소드들을 모두 정의해줘야 한다.

    먼저, 아래의 두 내용을 임포트하자. 구현 방식 세 가지에 동일하게 적용된다.

     

    (1). 위의 Message 클래스에서 WindowListener인터페이스를 상속 받아 windowClosing함수를 재정의

    먼저, 현재의 클래스에 WindowListener 인터페이스를 상속 받는다.

    우리는 위의 방식이 이상하지 않다고 생각한다. 그 이유는 인터페이스는 다중 상속이 된다고 알고 있다.

    그리고 Message 클래스의 생성자에서 이 종료 버튼의 이벤트를 등록하자.

    위의 addWindowListener 함수의 매개변수는 WindowListener를 요구하는데,

    Message 클래스는 이 인터페이스를 상속 받았으므로 this를 넣어준다.

    그리고 마지막으로 이 인터페이스의 추상 메소드를 모두 정의해주면 된다.

    위의 내용을 보면 우리가 구현할 것을 단순히 윈도우 창이 닫힐 때 창을 종료할 것이므로

    windowClosing 함수만 구현하면 된다.

    나머지 함수들은 빈 내용으로 정의를 했다.

    이와 같이 정의하고 실행하면 종료 버튼이 잘 작동됨을 알 수 있다.

     

    방식 (1) 소스 파일

    MessageTest.java
    0.00MB

     

    (2). 별 개의 클래스를 만들어서 재정의

    위의 방식(1)과 그 형태는 같다.

    종료 버튼을 눌렀을 시에 해야할 일을 별 개의 클래스가 처리하도록 만든다.Message 클래스가 WindowListener 인터페이스를 상속하지 않고, 별개의 클래스가 이를 상속 받는 모양이다.

    클래스 이름을 WindowButtonEvent 라고 하자.

    그리고, 종료 버튼에 대한 이벤트 등록은 다음과 같이 Message클래스의 생성자에서 한다.

    프로그램을 실행시킨다음에 종료 버튼을 누르면 제대로 동작됨을 알수 있다.

     

    방식(2) 소스 파일

    MessageTest.java
    0.00MB

     

    (3). 익명의 사용

    마지막 방법으로 익명을 사용해서 만들어 보자.

    아래와 같다. 별 다른 설명이 필요 없을 것 같다.

    방식(3) 소스 파일

    MessageTest.java
    0.00MB

     

    여기까지가 모든 내용의 끝이다.

    그런데, 위의 구현 방식들에는 문제가 많다.

    위의 인터페이스에서 사용하는 메소드가 하나 밖에 사용하지 않는데

    나머지 메소드들도 모두 재정의 해줘야 한다.

    이는 귀찮은 일이다.

    그렇기 때문에 이럴 때  WindowAdapter 라는 것을 사용한다.

    위의 방식(3)의 익명을 가지고 WindowAdapter 를 사용해보자.

    WindowAdapter를 사용하기 위해서는 임포트를 해줘야 한다.

    그리고 종료 버튼에 대한 이벤트 등록하는 부분이다.

    위와 같이 WindowAdapter를 사용하면 우리가 사용할 함수만 정의하고

    사용하지 않는 함수들은 정의를 해주지 않아도 된다.

     

    소스 파일

    MessageTest.java
    0.00MB

     

    나머지 방식들도 이와 같이 WindowAdapter를 적용해서 구현하면 된다.

    아래의 방식은 별 개의 클래스를 만들어서 재정의에 WindowAdapter를 적용한 것이다.

    WindowAdapter는 인터페이스가 아니다.

    그리고 Message 생성자에서 종료 버튼 이벤트 등록을 아래와 같이 한다.

    소스 파일

    MessageTest.java
    0.00MB

     

    댓글

Designed by Tistory.