학습목표
• GUI 이해
• GUI 검포넌트이해
• GUI 컨테이너 이해
• GUI 화면 구성 관리자 이해
• GUI 컴포넌트와 컨테이너 사용하기
• GUI 화면 구성 관리자 사용하기
• 사건 처리 이해
• 대화식 GUI 프로그램 작성하기
그래픽 사용자 인터페이스
그래픽 사용자 인터페이스는 사람과 컴퓨터간의 상호작용을 위한 사람-컴퓨터 인터페이스(Human-Computer Interface 혹은 HCI) 중의 하나이다. GUI는 사용자가 마우스를 누르거나 키보드 입력을 통해 아이콘(icon), 단추(button), 스크롤 바(scroll bar) 등과 같은 화면 상에 있는 객체들과 상호작용을 하는 인터페이스이다.
GUI 프로그래밍
GUI 프로그램을 실행시키변 메뉴가 있는 창(window) 이 뜨고 창에는 아이콘, 단추, 제어 요소(control) 등이 있다. 프로그램의 입력은 마우스나 키보드를 통해 수행하고 결과는 모니터 화면을 통해 본다. 화면에는 텍 스트 외에 그림, 이미지, 소리, 동영상 등과 같은 여러 형태의 멀티미디어가 보여질 수 있다. 이러한 프로그램을 작성하는 것이 GUI 프로그래밍이다.
자바의 GUI 지원 도구 모음
자바에서 GUI 응용들을 지원하기 위한 클래스들은 주로 java.awt 패키지와 Javax.swing 패키지에 정의된다. java.awt 패키지는 추상 윈도우 도구 모음(Abstract Window Toolkit 혹은 AWT)을 포함하는 자바 GUI 패키지이다. 스윙은 플랫폼 고유의 컴포넌트와 연계되지 않은 경량급의 빠른 컴포넌트들로 구성된 GUI 도구 모음이다. 스윙은 AWT보다 빠르고 유연성 이 있으며 확장성도 있다. 특히 스윙 패커지의 클래스들은 다른 운영체제들 상에서 더 많은 호환성을 제공한다. 더욱이 스윙 클래스들은 완전히 자바로 구현되어 다른 운영체제들에서 똑같이 작동한다. 또한 스원은 AWT 보다 신뢰성이 높고 더 많은 기능들을 가지고 있고 사용하기 쉽다. 스원은 자바에서 GUI 프로그래밍의 주류가 되어가고 있다. 따라서 자바 GUI 프로그램을 작성할 때 스원을 사용하는 것이 권장된다. 스윙 클래스들을 사용할 때 주의할 점은 같은 프로그램에서 AWT 컴포넌트와 스윙 컴포넌트를 같이 사용하는 것을 피해야 한다는 것이다.
스윙의 기본 구성요소
스윙의 기본 구성요소는 컴포넌트 (Component), 컨테이너 (Container)와 화면 구성 관리자(Layout Manager) 이다.
컴포넌트는 정보를 화면에 보여 주거나 사용자가 프로그램과 어떤 방식으로 상호작용하게 하는 화면상의 요소이다. 컴포넌트들의 예는 단추, 레이블 (label), 텍스트 필드(text field), 스크롤 바와 메뉴(menu) 등을 포함한다. 사용자가 컴포넌트와 상호 작용하는 것은 사건(event)을 일으킨다. 이러한 사건을 처리하는 것이 GUI 프로그램이 하는 주된 일이다. 따라서 GUI 프로그래밍을 하건 주도 프로그래밍 (event driven programming)이라고 부르기도 한다. 사건 처리는 이 장의 후반부에 다루어진다. 컴포넌트에 다른 컴포넌트를 추가할 수 없다.
컨테이너는 다른 컴포넌트들을 포함하는 특별한 유형의 컴포넌트이다. 프레임 (frame)과 패널 (panel)이 컨테이너의 예이다. 컴포넌트를 컨테이너에 포함한 후 그 컨테이너를 화면에 보이게 하면 포함한 컴포넌트가 화면에 나타난다. 컨테이너는 중량급 혹은 경량급으로 분류될 수 있다. 중량급 컨테이너는 운영체제에 의해 관리된다. 반면에 경량급 컨테이너는 자바 프로그램으로 관리된다. 프레임은 중량급 컨테이너이고 패널은 경량급 컨테이너이다. 일반적으로 중량급 컨테이너들은 경량급 컨테이너들보다 더 복잡하다. 일반적으로 우리는 GUI 기반 응용프로그램을 인터페이스가 보이는 프레임을 만 옮으러 써 작성할 수 있다. 그 인터페이스는 자주 주 패널로 구성된다. 주 패널은 프레임의 콘텐츠 구획 (content pane)에 추가된다. 주 패널에 있는 컴포넌트들은 필요한 대로 다른 패널들을 포함할 수 있다.
화면 구성 관리자는 컨테이너 내에서 컴포넌트의 위치를 결정한다. 즉 컴포넌트가 화면이나 화면의 특정 영역에 어떻게 배치되는지를 결정한다. 또한, 화면 구성 관리자는 창 내에 컴포넌트들의 배열이 창 크기의 변화에도 불구하고 비례적으로 남아 있는 것을 보장할 수 있다. 컴포넌트의 위치와 크기를 지정하기 위해 컨테이너는 화면 구성 관리자의 특정 객체를 계속 참조한다. 우리가 어떤 GUI를 만든다면 컴포넌트(들)를 포함하는 컨테이너를 화면상에 원하는 대로 배치하기 위해서 화면 구성 관리자를 선택한 후 이 관리자를 이용하는 컨테이너를 정한다. 그다음에 컴포넌트들을 컨테이너 안에 순서대로 추가한다. 그러면 화면 구성 관리자가 컴포넌트들을 컨테이너 안에 적절하게 배치한다.
컨테이너
스윙의 최상위 수준 컨테이너는 프레임 (JFrame), 윈도우(JWindow), 대화 상자(JDialog) 와 애플릿 (JApplet) 이다. 이러한 컨테이너는 스윙 컴포넌트들을 포함하는 공간으로 서 콘텐트 구획이라는 중간 컨테이너를 포함한다. 이 콘텐트 구획이 사실상 창에 보이는 모든 컴포넌트를 포함한다. 또 다른 중간 컨테이너에는 패널 (JPanel) , 스크롤 구획 (JScrollPane)과 Tabbed 구획 (JTabbedPane) 등이 있다. 패널은 여러 컴포넌트를 담을 수 있는 공간이고 스크롤 구획과 Tabbed 구획은 프로그램의 GUI 내에서, 더욱더 질 보이게 하고 대화적인 임무를 수행한다. 컨테이너 내에 컴포넌트들을 배치하는 화면 구성 관리자는 FlowLayout, BorderLayout, GridLayout, CardLayout, BoxLayout, GridBagLayout 등이다.
프레임
프레임은 자신의 제목 막대를 가진 별도의 창으로 보인다. 프레임은 마우서로 끌어당겨 화면상에서 위치를 바꿀 수 있고 크기를 조절할 수 있다. 프레임은 제목 막대의 오른쪽에 프레임을 가장 작게 만들거나 가장 크게 만들거나 닫게 하는 작은 단추들을 가진다. 프레임은 JFrame 클래스에 의해 정의된다. 프레임은 프레임 창의 여러 특성을 관장하는 여러 개의 구획들(panes)을 가진다. 자바 인터페이스의 모든 보이는 요소들은 프레임의 컨텐트 구획에 포함되어야 한다. 프레임의 콘텐트 구획을 사용하기 위해서는 getContentPane() 이라는 메소드를 호출하여 ContentPane의 한 객체를 만들어야 한다. 간단한 프레임 창을 만드는 프로그램을 작성해 보자. 우리가 컴퓨터에서 사용하는 대부분의 프로그램을 실행시키면 창(윈도우)이 뜬다. 그러한 창은 보통 프레임이다. 예를 들면 우리가 텍스트 편집기를 위한 프레임 창을 사용하기를 원한다면 사용자가 텍스트를 입력하고 오려두고 붙이고 폰트를 바꾸고 텍스트를 출력하는 기능을 가지는 프레임 창을 펼 요로 한다. 그러한 프레임 창을 설계하기 위해서 우리는 JFrame 클래스의 하위 클래스를 정의하고 필요한 기능들을 구현하기 위한 변수들과 메소드들을 추가한다. 새로운 프레임 창을 만들기 전에 컴퓨터 화면상에 기본 JFrame 객체를 보여주는 다음 프로그램을 보자. 스윙 패키지의 클래스들을 프로그램에서 사용하기 위해서는 다음과 같은 import 문을 사용해야 한다.
위 프로그램을 실행하면 다음과 같이 JFrame 객체가 화면에 나타난다. JFrame 객체를 생성하고 그 객체를 화면에 보이게 하기 위해 setVisible 메소드만을 호출하므로 아주 작은 기본 JFrame 객체가 화면의 좌측 상단 모서리에 보여진다.
그림에 보여진 기본 프레임에 다음 기능들을 추가하는 클래스를 작성해 보자.
• 프레임의 제목을 ‘간단한 프레임’으로 한다.
• 프레임의 우측 상단에 있는 X 표시의 닫기를 클릭하면 프로그램이 종료된다.
• 프레임의 크기는 가로와 세로를 각각 200픽셀과 100핀셀로 한다.
• 프레임의 좌측 상단 모서리가 화면 상의 좌표 (50, 50)에 위치하게 한다.
이런 기능들을 가진 수정 프레임의 화면 구성은 다음 그림에 보여진다.
위 기능들은 모두 생성자 메소드 내에서 구현할 수 있다. 프레임의 제목을 정하기 위해서 우리는 다음과 같이 setTitle 메소드를 ‘간단한 프레임’이라는 매개변수를 가지고 호출한다.
프레임의 크기를 정하기 위해서 우리는 다음과 같이 setSize 메소드를 가로의 길이인 200과 세로의 길이인 100을 매개변수로 하여 호출한다.
프레임의 위치를 정하기 위해서 우리는 다음과 같이 setLocation 매소드를 좌측 상단 모서리의 x 좌표인 50과 y 좌표인 50을 매개변수로 하여 호출한다.
마지막으로 프레임이 닫힐 때 프로그램이 종료되게 하기 위해서 우리는 다음과 같이 setDefaultCloseOperation 메소드를 EXIT ON CLOSE라는 JFrame 클래스의 상수를 가지고 호출한다.
완성된 프로그램은 다음과 같이 보여진다.
패널
패널은 경량급 컴포넌트들을 위한 컨테이너이나, 프레임과 달리 화면에 직접 보일 수 없다. 패널은 보이기 위해서 또 다른 컨테이너에 추가되어야 한다. 일반적으로 패널은 포함하는 컨테이너가 움직이지 않으면 움직이지 않는다. 패널의 주요 역할은 GUI 안에 있는 다른 컴포넌트들을 구성하는 것을 돕는 것이다. 기본적으로 패널은 바탕만 칠할 수 있다. 그러나 우리는 쉽게 패널의 둘레에 경계를 둘 수 있고 패널 내에 그리는 것을 우리가 원하는 대로 할 수 있다. 또한, 패널은 기본적으로 불투명하다. 이는 패널이 컨텐트 구획으로서 잘 작동되게 하고 그리는 것의 효율성을 높일 수 있다. 투명한 패널은 컴포넌트들이 보이도록 바탕을 칠하지 않는다. 패널은 컴포넌트들을 하나의 그룹으로 모으고 컴포넌트 구성을 단순화하고 컴포넌트들의 그룹 둘레에 경계를 두는 데 유용하다. 또한, 컴포넌트들의 위치와 크기를 정하기 위해 화면 구성 관리자를 사용한다. 패널의 기본 화면 구성 관라자는 FlowLayout 관리자이다. 패널에 컴포넌트들을 추가하기 위해 우리는 add() 메소드를 사용한다. add 메소드 호출 시 어떤 실제 매개 변수들을 사용하느냐는 패널이 사용하는 화면 구성 관리자에 달려 있다. 다음 프로그램은 비어있는 초록색의 패널을 포함하는 프레임을 만든다 JFrame 생성자 메소드는 ‘패널 포함 프레임’이라는 문자열을 매개변수로 받는다. 그 문자열은 제목 막대에 보인다. setDefaultCloseOperation 메소드 호출은 프레임의 오른쪽 모서리에 있는 닫기 버튼을 누를 때 일어나는 일을 결정한다. 대부분은 우리는 프로그램을 종료시킨다. 이는 EXIT_ON_CLOSE 상수에 의해 나타내진다. 패널은 JPanel 클래스의 객체를 생성함으로써 만들어진다. 패널의 바탕색은 setBackground 메소드를 사용하여 정해진다. setPreferredSize 메소드는 Dimension 객체를 매개변수로 받아들인다. 그 객체는 패널의 가로와 세로의 길이를 나타내기 위해 사용된다. 많은 컴포넌트의 크기는 이런 식으로 정해질 수 있다. 컨테이너는 다른 컴포넌트들을 자신에 추가하는 add 메소드를 가진다. 프레임의 컨텐트 구획은 getContentPane 메소드를 사용하여 얻어진다. 그 다음에 주 패널을 프레임에 추가하기 위하여 콘텐트 구획의 add 메소드가 호출된다. 프레임의 pack 메소드는 포함되는 컴포넌트들에 기초하여 자신의 크기를 적절하게 정한다. 이 경우에 프레임의 크기는 포함하는 패널들의 크기를 수용하도록 정해진다. setVisible 메소드에 대한 호출은 프레임이 모니터 화면에 보이게 한다.
컴포넌트
스윙 컴포넌트들은 AWT 컴포넌트들의 기능을 향상한 것이거나 새로이 추가된 것이다. 전자에 속하는 컴포넌트들은 단추 (JButton) , 제크박스 (JCheckBox) , 레이블(JLabel), 목록(JList), 스크롤 막대 (JScrollBar), 텍스트 필드(JTextField) 등이다. 물론 컨테이너도 컴포넌트에 속하므로 프레임, 대화상자 패널 등도 포함된다. 새로이 추가된 주요 컴포넌트들은 JComboBox, JlnternalFrame, JPasswordField, JProgressBar, JToggleButton, JToolBar, JToolTip 등이다. 스윙 컴포넌트들은 그래픽스를 지원한다. 모든 스윙 검포넌트는 paintComponent 메소드를 가진다. paintComponent 메소드는 패널과 같은 컨테이너에 대한 그래픽스 컨텍트(context)를 나타내는 Graphics 객체를 입력으로 받는다.
레이블
레이블은 한 GUI 안에 텍스트 를 보여주는 컴포넌트이다. 대개 레이블은 정보를 보여주거나 GUI 안에 있는 다른 컴포넌트들을 식별하기 위해 사용된다. 레이블은 JLabel 클래스에 의해 정의된다. 레이블은 거의 모든 GUI 기반 프로그램에서 찾을 수 있다. 례이블은 어떤 사건도 발생시카지 않는다. 또한, 레이블은 이미지를 보여 줄 수 있다. 즉 레이블은 텍스트, 이미지 혹은 텍스트와 이미지로 구성될 수 있다. ‘이름을 입력하세요.’라는 텍스트를 보여주는 레이블은 다음과 같이 만들 수 있다.
다음은 앞 코드를 포함하는 간단한 프로그램을 실행한 화면이다.
ImageIcon 클래스는 레이블 내에 포함된 이미지를 냐타내기 위해 사용된다. ImageIcon 생성자 매소드는 이미지 파일의 이름을 입력으로 받아 그것을 객체 안에 넣는다. ImageIcon 객체는 JPEG이나 GIF 이미지를 사용하여 만들 수 있다. 레이블 내에 이미지를 보여주기 위해서 우리는 JLabel 객체를 만들 때 매개변수로 문자열 대신에 ImageIcon 객체를 넘겨준다. 다음은 flag.gif라는 이미지 파일을 포함하는 ImageIcon 객체를 만든 후 그 이미지를 보여 주는 Label 객제를 만드는 예이다.
단추
단추는 사용자가 마우스의 누름으로 동작 을 시작하는 컴포넌트이다. 다른 유형의 단추 컴포넌트들이 있다. 단추는 JButton 클래스에 의해 정의된다. 단추는 눌러질 때 Action 사건을 발생시킨다. 단추를 프로그램에서 사용하기 위해서 우리는 JButton 객체를 만든다. 단추 내에 보여지는 문자열은 JButton 객체를 만들 때 넘겨준다. 예를 들면 다음 코드는 ‘확인’이라는 문자열을 가진 JButton 객체와 ‘취소’라는 문자열을 가진 JButton 객체를 만든다.
다음은 위 코드를 포함하는 간단한 프로그램을 실행한 화면이다.
텍스트 필드
텍스트 필드는 사용자가 한 줄의 텍스트를 입력하게 하는 컴포넌트이다. 텍스트 필드는 JTextField 클래스에 의해 정의된다. 텍스트 필드 객체는 Action 사건을 발생시킨다. 커서가 텍스트 필드 객체 내에 있고 사용자가 Enter 키를 누르면 Action 사건이 발생한다. 텍스트 필드를 프로그램에서 사용하기 위해서 우리는 JTextField 객체를 만든다. 이때 입력할 수 있는 문자들의 수를 정할 수 있다. 최대 10개의 문자들을 입력할 수 있는 JTextField 객체를 만들기 위해 다음과 같이 한다.
다음은 위 코드를 포함하는 간단한 프로그램을 실행한 결과화면이다.
체크박스
체크박스는 마우스를 사용하여 ON이나 OFF 상태 중의 하나를 선택하게 하는 단추 이다.ON과 OFF는 특정 조건이 지정되거나 해제됨을 나타낸다. 체크박스는 JCheckBox 클래스에 의해 정의된다. 체크박스는 상태가 바뀔 때마다 Item 사건이 발생한다. ItemListener 인터페이스가 Item 사건 라스너들을 정의하기 위해 사용된다. 체크박스는 상태가 바뀔 때 리스너의 itemStateChanged 메소드를 호출한다. 제크박스의 사용 예는 다음과 같다.
다음은 위 코드를 포함하는 간단한 프로그램을 실행한 다음 마우스로 고닥체를 선택한 후의 화면이다.
라디오 단추
라디오 단추는 상호 배타적인 선택사항들을 나타내기 위해 다른 라디오 단추들과 같이 사용 된다. 체크 박스와 달리 한 라디오 단추는 자체적으로는 특별히 유용하지 않다. 라디오 단추는 한 개 이상의 다른 라디오 단추들과 같이 사용될 때에만 의미가 있다. 여러 개의 라디오 단추들 중 하나만 선택된다. 라디오 단추는 한번에 한 단추만 선택될 수 있는 단추들의 그룹이다. 한 그룹에서 한 라디오 단추가 선택될 때 현재 ON 상태에 있는 라디오 단추는 OFF 상태로 바뀐다. 체크박스와 달리 함께 동작할 라디오 단추들의 그룹을 정의하기 위해 각 라디오 단추는 ButtonGroup 객체에 더해진다. 라디오 단추는 Action 사건을 발생시킨다. 다음은 네 개의 단추틀을 포함하는 라디오 단추를 만드는 코드의 예이다.
다음은 위 코드를 포함하는 간단한 프로그램을 실행한 화면이다.
콤보박스
콤보박스(JComboBox)는 두 가지 형태 가 있다. 즉 편집할 수 없는 콤보박스와 편집할 수 있는 콤보박스이다. 기본 콤보박스는 편집할 수 없는 콤보박스이다. 이 콤보박스는 마우스로 클력할 때까지 단추처럼 보인다. 클릭하면 선택할 항목들의 메뉴를 보여준다. 콤보박스는 사용자가 '아래로 내리기 (drop down)' 메뉴로부터 여러 선택 항목들 중의 하나를 선택하게 한다. 사용자가 마우스를 사용하여 콤보박스를 누룰 때 선택 항목들의 목록이 보여진다. 사용자가 이 항목들 중 하나를 선택하면 그 항목이 보여진다. 콤보박스는 JComboBox 클래스에 의해 정의된다. 다음 모드는 편집할 수 없는 콤보박스를 만든다.
위 코드를 포함하는 간단한 프로그램을 실행한 후의 초기 화면을 보여준다.
선택사항들 중의 하나를 선택한 후의 화면을 보여준다.
화면 구성 관리자
GUI 기반 프로그램의 골격을 구성하는 컴포넌트들 사건들 사건 처리기틀 외에 화면 설계에서 가장 중요한 일은 화면 구성 관리자의 사용이다. 화면 구성 관리자는 컴포넌트들 이 컨테이너 안에 어떻게 배치되는지를 정하는 객체이다. 이 객체는 각 컴포넌트의 크기와 위치를 결정한다. 그렇게 하기 위해 많은 요소들을 고려해야 한다. 모든 컨테 이너는 기본 화면 구성 관리자를 가진다. 그러나 우리는 화면 구성 관리자를 명확히 지정할 수 있다. 표준 클래스 라이브러리에 정의된 주요 화면 구성관리자들은 다음과 같다.
• FlowLayout: 컴포넌트들을 왼쪽에서 오른쪽으로 추가된 순서대로 배치한다. 한 줄이 다 차면 다음 행으로 넘어간다.
• BorderLayout: 컴포넌트들을 5개의 구역 (North, South, East, West와 Center) 중의 하나에 배치한다.
• CardLayout: 각 컴포넌트의 크기를 컨테이너의 크기와 같게 하고 카드덱 (Card Deck)처럼 컴포넌트들을 포개 놓고 한 번에 한 컴포넌트만 화면에 보이게 한다.
• GridLayout: 컨테이너의 공간을 지정된 수의 행과 열로 나누고 컴포넌트들을 추가된 순서대로 첫 번째 행의 왼쪽에서 오른쪽으로 배치하고 다차면 다음 행에 같은 방식으로 배치한다.
• GridBagLayout: 컴포넌트들을 셀들(cells)의 격자 안에 배치한다. 한 컴포넌트가 하나 이상의 셀에 배치될 수 있다.
• BoxLayout: 컴포넌트들을 한 행 혹은 한 열에 배치한다.
이 중 BoxLayout는 스윙 패커지에 정의되어 있다. 나머지는 AWT 패커지에 정의되어 있다. 각 화면 구성 관리자는 컴포넌트들을 어떻게 배치할 지를 정하는 자신만의 특별한 규칙들을 가지고 있다. 일부 화면 구성 관리자는 한 컴포넌트의 선호하는 크기 혹은 정렬에 주의 를 기울인다. 반면에 다른 관리자들은 그렇지 않다. 화면 구성 관리자는 컴포넌트들이 컨테이너에 더해질 때와 컨테이너의 크기가 변경될 때 화면 구성을 조정하려고 시도한다. 우리는 한 컨테이너의 화면 구성 관리자를 변경하기 위해 setLayout 메소드를 사용할 수 있다. 다음은 패널의 화면 구성 관리자를 BorderLayout 로 바꾸는 코드이다.
패널 객체를 생성할 때 화면 구성 관리자를 지정할 수도 있다. 따라서 위 코드는 다음과 같이 수정할수 있다.
FlowLayout 관리자
FlowLayout 관리자는 컴포넌트를 컨테이너 안에 줄 단위로 배치한다. 같은 줄 내에 서는 왼쪽에서 오른쪽으로 배치한다. 한 줄이 다 채워지면 다음 줄로 자동적으로 넘어간다. 다른 관리자와는 달리 이 관리자는 컴포넌트의 크기를 제한하지 않으며 오히려 각 컴포넌트 가 최적 크기가 되도록 허용한다. 이 관리자가 관리하는 창의 크기를 변경하면 화면 구성도 바뀐다. 이 관리자는 컴포넌트들이 각 줄에 가운데 정렬로 배치되도록 기본 설정되어 있다. 이를 생성자 메소드 호출시 매개변수 값을 달리 하여 왼쪽 정렬이나 오른쪽 정렬로 설정하여 이에 따라 컴포넌트를 배치할 수 있다. 예를 들면 다음 코드는 정렬 방식을 차례대로 오른쪽 정렬, 왼쪽 정렬, 가운데 정렬로 정한다.
다음 프로그램은 FlowLayout 관리자를 사용하는 예를 보여준다. 이 프로그램은 프레임 에 ‘White’, ‘Green’, ‘Red’, ‘Yellow’, ‘Black ’이라는 단추를 순서대로 추가한다. 프레임 내에 모든 보이는 요소들은 프레임의 컨텐트 구획에 포함되어야 한다. 프레임의 컨멘트 구획 을 사용하기 위해서는 getContentPane() 이라는 메소드를 호출하여 ContentPane 의 한 객체를 만들어야 한다. 그 다음에 그 객체의 화면 구성 관리자를 정하기 위해서는 그 객체에 대해 setLayout() 메소드를 호출해야 한다. 예를 들변, fr라는 프레임의 화면 구성 관라자를 BorderLayout으로 정하기 위해서는 다음과 같이 한다.
실행하면 한 개의 창이 뜨면서 다음과 같은 화면을 보여 준다.
위의 창의 폭을 줄이면 5개의 단추가 한 줄에 다 들어가지 않으므로 다음과 같이 두 행에 걸쳐 보여진다.
BorderLayout 관리자
BorderLayout 관리자는 컨테이너의 화면을 지도에서와 같이 North, South, East, West 및 Center 등의 디섯 개의 독립적인 영역으로 나눈다. North, South, East와 West 영역은 그들이 포함하는 컴포넌트를 수용하기 위해서 필요한 만큼 크게 확장된다. 어떠한 컴포넌트도 각 영역에 추가되지 않는다면 그 영역은 전체 구성에서 어떠한 공간도 치지하지 않는다. 대신에 Center 영역이 채워지지 않은 영역으로 확장한다. BorderLayout를 사용하는 컨테이너에 컴포넌트를 추가하기 위해 add 메소드를 사용한다. 이 메소드의 첫 번째 매개변수는 추가하는 검포넌트이다. 두 번째 매개변수는 컴포넌트를 넣을 영역의 이름이다. 각 영역에는 하나의 컴포넌트만을 추가할 수 있다. 한 컨테이너가 BorderLayout를 사용한다면 컴포넌트를 추가하기 전에 다음과 같이 setLayout 메소드를 호출하여야 한다.
다음으로 한 영역에 컴포넌트를 추가하기 위해 add 메소드를 호출해야 한다. 이 경우 컴포넌트 이름과 영역의 이름을 매개변수로 넘겨 주어야 한다. 예를 들면 aComponent 라는 컴포넌트를 Center 영역에 추가하는 코드는 다음과 같다.
다음 프로그램은 BorderLayout 관리자를 사용하는 예를 보여준다. 이 프로그램은 프레임에 ‘White’, ‘Green’, ‘Red’, ‘Yellow’, ‘Black’이라는 단추를 각각 South, West, Center, East와 North 영역에 추가한다.
실행하면 한 개의 창이 뜨면서 다음과 같은 화면을 보여 준다.
GridLayout 관리자
GridLayout 관리자는 컨테이너 안에 좀 더 융통성 있게 컴포넌트를 배치할 수 있게 한다. 이 관라자는 컨테이너의 영역을 여러 행과 여러 열로 나누게 한다. 예를 들면 영역을 4행 과 3 열로 나누기 위해서 다음과 같이 한다.
그러면 4행과 3열로 나누어진 12개의 영역이 생긴다.
컴포넌트를 추가하기 위해 BorderLayout와는 달리 위치를 지정해 줄 필요가 없다. 추가하는 순서대로 위치가 정 해진다. 처음에 추가되는 검포넌트는 첫 번째 행의 첫 번째 열에 들어가고 두 번째 추가되는 컴포넌트는 젓 번째 행의 두 번째 열에 들어간다. 다음 프로그램은 GridLayout 관리자를 사용하는 예를 보여준다. 이 프로그램은 프레임을 2행 3 열로 나눈다. 만들어진 6개의 영역에 ‘White, ‘Green’, ‘Red’, ‘Yellow’, ‘Black’이라는 단추를 순서대로 추가한다. 채워지지 않은 영역은 공란으로 남는다.
실행하면 한 개의 창이 뜨면서 다음과 같은 화면을 보여준다.
CardLayout 관리자
CardLayout 관리자는 인터페이스를 한 번에 한 장씩 나타내는 일련의 카드처럼 다룰 수있다. 예를 들면 세 개의 패널이 있는 프레임이 있고 이 프레임은 CardLayout 관리자를 사용한다고 가정하자. 그러면 이 프레임의 패널을 마우스로 누르면 그 다음 패널로 넘어간다. 다음 그림은 이 경우에 노란색 바탕의 첫 번째 패널에서 마우스를 누를 때 초록색 바탕의 두 번째 패널로 넘어가는 것을 보여준다.
BoxLayout 관리자
BoxLayout 화면 구성 관리자는 컴포넌트들을 한 행에 수평적으로 배치하거나 혹은 한 열에 수직적으로 배치한다. 다른 화면 구성 관리자와 결합하여 아주 복잡한 화면 구성을 할 수 있다. 그러나 GridBag 화면 구성 관리자를 사용하는 것보다는 훨씬 쉽게 할 수 있다. BoxLayout 화면 구성 관리자를 사용하는 컨테이너에 컴포넌트들을 추가할 때 추가하는 순서대로 왼쪽에서 오른쪽으로 혹은 위에서 아래로 위치가 정해진다. BoxLayout 객체가 만들어질 때 우리는 BoxLayout 클래스에 정의된 상수들을 사용하여 수평적 배치나 수직적 배치를 정할 수 있다. 다른 화면 구성 관리자들과는 달리 BoxLayout의 생성자 메소드는 그것이 관장할 컴포넌트를 첫 번째 매개변수로 받아들인다. 그러므로 새 BoxLayout 객체가 각 컴포넌트에 대해 생성되어야 한다.
사건 처리
우리가 텍스트 편집기나 웹 브라우저와 같은 GUI 프로그램에서 자주 수행하는 작업을 생각해 보도록 하자 우리가 GUI 프로그램을 사용하면서 자주 수행하는 작업들은 다음과 같다.
- 단추를 누른다.
- 마우스를 클릭한다.
- 메뉴에서 한 항목을 선택한다.
- 텍스트 필드에 글자를 입력한다.
- 한 체크박스를 선택한다.
그러면 프로그램은 우리가 하는 작업에 적절하게 대응하여 어떤 일을 처리한다. 사용자가 GUI 프로그램에서 자주 수행하는 대부분의 작업이 사건이다. 사건은 GUI 프로그램이 관심을 가질지 모르는 어떤 일의 발생을 나타내는 객체이다. 자주 사건들은 마우스 단추를 누르거나 키보드를 통해 키를 입력하는 것과 같은 사용자 행동들에 대응하여 발생한다. 대부분의 컴포넌트들은 자신과 관련된 사용자 행동을 나타내기 위해서 사건들을 일으킨다. 예를 들면 단추 컴포넌트는 단추가 눌러졌다는 것을 나타내기 위해서 사건을 일으킨다. 이러한 사건은 GUI 프로그램에서 사용자와 윈도우 컴포넌트 간의 인터페이스 역할을 탐당하는 중요한 수단이다. 사용자로부터의 사건들에 반응하는 GUI 기반 프로그램은 사건 주도 프로그램이라고 부른다. 전통적인 프로그램과는 다르게 사건 주도 프로그램은 사건의 발생을 기다리다가 사건이 발생하면 그 사건에 대응되는 일을 처리해 주는 다음과 같은 구조를 갖는다.
따라서 GUI 프로그램은 사용자가 종료할 때까지 계속 실행된다.
사건 처리 방법
GUI 프로그램에서 사건을 어떻게 처리하는지를 알아보자. 자바에서 사건을 처리하는 모델은 위임형(대리) 사건 모델 (delegation event model) 이라고 한다. 이 모델에서 사건 처리는 두 유형의 객체들인 사건 소스(event source) 객체들과 사건 리스너 (event listener) 객체들에 의해 구현된다. 사용자가 GUI 프로그램에서 단추와 같은 컴포넌트를 누르면 사건이 발생한다. 이때 사건이 발생한 컴포넌트가 사건 소스이다. 이 경우 사건 소스가 사건을 일으킨다고 한다. 예를 들면 사용자가 한 단추를 누를 때 대응하는 JButton 객체가 Action 사건을 발생시킨다. 사건이 발생할 때 시스템이 사건 발생 사실을 알리는 객체가 사건 리스너이다. 사건 리스너는 발생한 사건에 대응하여 수행되는 메소드를 포함하는 객체이다. 자바의 위임형 사건 모델은 사건이 발생한 사건 소스에서 직접 사건을 처리하는 것이 아니고 사건 처리를 위임받은 사건 리스너에서 사건을 처리한다. 이를 위해 사건이 발생되는 사건 소스에 사건 리스너를 등록해야 한다. 사건 소스는 사건 리스너를 등록하기 위해 사건 소스 컴포넌트의 메소드 add***Listener를 이용한다. 여기서 표시 *** 는 사건에 따른 사건의 이름을 표기한다. 예를 들면 단추를 마우스로 누르는 사건을 처라하기 위해서는 사건 소스인 단추에서 발생하는 사건이 Action 사건이다. 따라서 우리는 addActionListener 메소드를 호출한다. 이 메소드 호출의 실제 매개변수는 사건 처리를 담당하는 사건 리스너 객체이다. 다음은 ‘Test’라는 이름의 단추(사건 소스)에서 발생하는 사건을 처리하는 ButtonHandler 클래스가 정의되어 있다고 가정하고 button이라는 사건 소스 객체에 handler라는 사건 리스너 객체를 등록하는 코드이다.
ActionEvent 사건인 경우 인터페이스 ActionListener가 ActionEvent를 처리하는 리스너이다. 이 ActionListener는 메소드 actionPerformed(ActionEvent e)를 추상 메소드로 갖는 인터페이스이다. 위 코드의 ButtonHandler 클래스는 ActionListener 인터페이스를 구현한 클래스이다.
대화식 GUI 프로그램 작성
대화식 GUI 기반 응용 프로그램을 작성하기 위해서 최소한 세 가지 종류의 객체들이 필요하다.
• 컴포넌트(들)
• 사건(들)
• 사건 리스너(들)
컴포넌트는 정보를 보여주거나 사용자가 프로그램과 어떤 식으로 상호작용하는 것을 허용하는 객체이다. 사건은 우리가 관심을 가질지 모르는 어떤 일의 발생을 나타내는 객체이다. 사건 리스너는 사건이 일어나기를 기다리다가 사건이 발생하면 대응하는 객체이다. 우리는 사건 리스너, 대응하는 사건, 사건을 발생시카는 검포넌트 사이의 관계를 주의 깊게 설정해야 한다. 대부분의 경우에 우리는 표준 클래스 라이브러리에 있는 클래스들에 의해 정의된 컴포넌트들과 사건들을 사용할 것이다. 우리는 컴포넌트들의 동작을 우리 필요에 맞출 것이다. 그러나 사건들이 일어날 때 우리가 원하는 동작들을 수행하기 위해 리스너 클래스들을 작성할 것이다. 특히 GUI 를 사용하는 대화식 프로그램을 작성하기 위해서 우리가 해야 할 일은 다음과 같다.
- 필요한 컴포넌트들과 객체를 만들고 초기화한다.
- 특정 사건이 발생할 때 일어나는 것을 정의하는 리스너 클래스를 구현한다.
- 관심 있는 사건을 발생시키는 컴포넌트와 사건 리스너 사이의 관계를 설정한다.
예제 프로그램 1
우리가 작성하고자 하는 프로그램은 사용자에게 두 개의 단추들을 제시한다. 한 단추는 '확인'으로 표시되고 다른 단추는 '취소'로 표시된다. 사용자가 '확인' 단추를 누르면 "확인 단추가 눌러졌습니다"라는 메시지를 보여주고 '취소' 단추를 누르면 "취소 단추가 눌러졌습니다"라는 메시지를 보여준다.
이 프로그램을 작성하기 위해 해야 할 두 가지 일이 있다. 첫 번째 일은 프레임의 컨텐트 구획에 두 개의 단추들 객체와 한 개의 레이블 객제를 만들어 추가하는 것이다. 다른 일은 두 개의 단추들이 일으키는 사건들을 처리해야 한다. 우리는 프로그램을 두 단계로 개발한다. 먼저 두 개의 단추들과 한 개의 레이블을 프레임에 어떻게 배치하는지를 보여주기 위한 클래스를 작성한다. 다음으로 단추가 눌러질 때 발생하는 사건이 어떻게 레이블을 바꾸는 지를 보여주기 위해 클래스를 보완한다.
프레임 구성
프레임에 포함되는 컴포넌트들은 두 개의 단추와 메시지를 보여주는 레이블이다. 우리가 작성하는 ButtonDemo라는 클래스를 JFrame 클래스의 하위 클래스로 만든다. 따라서 클래스의 변수들은 다음과 같다.
• ok: 확인 단추를 나타낸다.
• cancel: 취소 단추를 나타낸다.
• outputLabel: 메시지를 보여주는 레이블을 나타낸다.
이 클래스에서 해야 할 일은 다음과 같다.
• 프레임의 제목을 정한다.
• 프레임의 크기를 정한다.
• 프레임의 콘텐트 구획의 화면 구성 관리자를 FlowLayout로 정한다.
• 두 개의 단추와 레이블을 프레임의 콘텐트 구역에 추가한다.
• 프레임의 콘텐트 구획의 바탕색을 cyan 색으로 정한다.
• 프로그램을 닫을 때 종료되게 한다.
단추 사건 처리
우리가 작성하는 프로그램에서 처리해야 할 유일한 사건은 단추가 눌러졌을 때 일어난다. 그 사건에 대한 처리를 담당하는 리스너 클래스를 정의해야 한다. 이 리스너 클래스를 ButtonListener 라고 하자. 단추가 일으키는 사건은 Action 사건 이다. 따라서 ButtonListener 클래스는 ActionListener 인터페이스를 구현해야 한다. ActionListener 인터페이스는 java.awt.event 패키지에 다음과 같이 정의되어 있다.
따라서 ButtonListener 클래스는 ActionListener 인터페이스를 구현해야 한다. 이는 actionPerformed 메소드를 구현해야 함을 의미한다. 또한 ButtonListener 클래스는 ButtonDemo 클래스에서만 이용하므로 ButtonDemo 클래스의 내부 클래스로 정의한다. 따라서 ButtonListener 클래스는 다음과 같은 형태를 취한다.
우리가 단추를 누르면 Action 사건이 발생한다. 그 사건이 발생할 때 actionPerformed 메소드가 호출된다. 이 때 그 사건을 나타내는 ActionEvent 객제를 매개변수로 넘겨준다. 우리는 어느 단추가 눌러졌는지를 확인하기 위해 그 ActionEvent 객체를 조사해야 한다. 그 객체에 대응하는 사건을 일으킨 컴포넌트를 알아야 한다. 이를 위한 메소드가 getSource 메소드이다. 찾은 컴포넌트에 따라 레이블의 텍스트를 적절하게 변경해야 한다. 이를 위한 메소드가 setText 메소드이다. 따라서 actionPerformed 메소드는 다음과
같이 정의한다.
마지막으로 우리는 Action 사건을 일으키는 컴포넌트와 그 사건을 처리하는 사건 리스너를 연결시켜야 한다. 이를 위한 메 소드가 addActionListener 메소드이다. 프로그램에서 Action 사건은 ok 단추와 cancel 단추에서 발생한다. 두 개의 단추에서 발생한 사건들은 하나의 ButtonListener 객체에 의해 처리 가능하다. 두 개의 단추 객체들의 사건 리스너로 ButtonListener 객체를 등록하기 위한 코드는 다음과 같다.
위 코드는 ButtonDemo 클래스의 생성자 메소드 내에 ok 단추와 cancel 단추를 추가하는 코드 다음에 넣으면 된다. 사건 처리를 추가한 완전한 프로그램은 다음과 같다.
예제 프로그램 2
다음에 작성하는 프로그램은 환전하는 프로그램 이다. 사용자가 원화로 환전 금액을 입력하면 환전받는 금액을 딜러로 알려준다. 환전 금액을 입력하기 위해 텍스트 필드를 사용한다. 사용자가 텍스트 필드에 환전 금액을 입력하고 Enter 키를 누르면 대응하는 환전 받는 금액이 계산되어 보인다. 이 프로그램은 예제 프로그램 1과 비슷하다. 다른 점은 프레임에 포함되는 컴포넌트들이다. 이 프로그램에서 사용되는 컴포넌트들은 사용자에게 환전금액을 요청하는 메시지와 환전받는 금액의 의미를 설명하는 메시지를 나타내는 레이블들, 환전 금액을 입력하기 위한 텍스트 필드, 환전받는 금액을 보여주는 레이블로 구성된다.
우리가 작성하는 MoneyExchange 라는 클래스의 변수들은 다음과 같다.
• money: 환전 금액을 입력하기 위한 텍스트 필드를 나타낸다.
• input Label: 사용자에게 환전 금액을 요청하는 메시지를 보여주는 레이블을 나타낸다.
• outputLabel: 환전받는 금액의 의미를 설명하는 메시지를 보여주는 레이블을 나타낸다.
• resultLabel: 환전받는 금액을 보여주는 레이블을 나타낸다.
텍스트필드의 생성자 메소드는 사용자가 입력하는 문자들의 최대 수를 정하는 정수형 매개변수를 받아 들인다. 최대 10자의 문자열을 입력할 수 있는 텍스트 필드 객체를 만드는 모드는 다음과 같다.
패널은 기본 화면 구성 관리자인 FlowLayout 관리자에 의해 컴포넌트들이 패널에 더해지는 순서대로 보인다. 프레임이 한 줄에 보여줄 수 있는 만큼 많은 컴포넌트들을 배치한다. 따라서 프레임의 크기를 변경하면 레이블들과 텍스트 필드의 위치가 바뀔 수 있다. 커서가 현재 텍스트 필드에 있다면 텍스트 필드 컴포넌트는 Enter 키가 눌러질 때 Action 사건을 일으킨다. 그러므로 이 사건에 대응하는 리스너 객체를 정할 필요가 있다. 이 리스너는 단지 Money ExchangePanel에 의해서만 사용 되므로 내부 클래스로 정의한다. 사용자가 Enter 커를 누를 때 텍스트 필드 컴포넌트는 actionPerformed 메소드를 호출한다. 그 메소드는 먼저 getText 메 소드를 호출함으로서 텍스트 필드로부터 텍스트를 끄집어낸다. 다음으로 그 텍스트는 Integer 포장자 클래스의 parselnt 메소드를 사용하여 정수로 변환된다. 그리고 나서 환전받는 금액을 계산하여 결괏값을 Integer 포장자 클래스의 toString 메소드를 이용하여 적절한 레이블의 텍스트로 바꾸어준다.
환전 프로그램은 다음과 같다. 사용자가 텍스트필드에 5,000,000을 입력하고 Enter 키를 누르면 4166 이 텍스트 필드 밑에 레이블로 보여진다. 우리는 $1가 1,200원으로 환전된다고 가정한다.
예제 프로그램 3
그래픽 사용자 인터페이스 기반의 입출력을 제공하는 쉬운 방법들 중의 하나는 JOptionPane 클래스를 사용하는 것이다. 그 클래스는 대화상자(dialog box)라고 불리는 특별한 창을 만들기 위해 사용한다. 대화 상자는 현재 활동 창 위에 나타나는 그래픽 창이다. 사용자가 대화상자와 상호 작용할 수 있다. 대화 상자는 어떤 정보를 전달하거나 동작을 확인하거나 사용자가 어떤 정보를 입력하는 것을 허용한다. 그러냐 대개 대화 상자는 한 가지 목적만을 위해 사용되고 사용자와의 상호 작용 시간은 짧다. JOptionPane 대화 상자의 기본 포맷들은 세 가지 부류로 나누어진다. 메시지 대화 상자(Message Dialog)는 단순히 출력 문자열을 보여 준다. 입력 대화 상자(Input Dialog)는 프롬프트와 입력 텍스트 필드를 제시한다. 사용자는 텍스트 필드에 데이터 문자열을 입력 할 수 있다. 확인 대화 상자(Confirm Dialog)는 사용자에게 예 혹은 아니오 질문을 제시한다. JOptionPane 클래스의 주요 메소드들은 다음과 같다.
-
static String showMessageDialog(Component parent, Object msg): 지정된 msg를 포함하는 메시지 대화 상자를 보여 준다. parent 컴포넌트가 null이면 대화 상자가 스크린 중앙에 위치한다.
-
static String showInputDialog(Object msg): 지정된 msg와 사용자로부터 압력을 받기 위한 텍스트 필드와 ‘확인/취소’ 단추를 포함하는 입력 대화 상자를 보여 준다. 입력된 텍스트 필드의 내용을 반환한다.
-
static String showConfirmDialog(Component parent, Object msg): 지정된 msg와 ‘예/아니오/취소’ 단추 선택사항들을 포함하는 확인 대화 상자를 보여 준다. parent 컴포넌트가 null이면 대화 상자가 스크린 중앙에 위치한다.
다음 프로그램은 세 가지 유형의 대화 상자들을 사용한다. 이 프로그램은 1부터 10사이의 정수를 임의로 선택한 후 사용자가 이 정수를 추측하게 한다. 먼저 사용자에게 추측하는 정수를 입력하라고 요청하는 입력 대화 상자를 제시한다. 사용자가 그 대화 상자에 추측 정수를 입력하고 ‘확인’ 단추를 누르면 선택된 정수와 추측 정수를 비교한 결과를 메시지 대화 상자를 이용하여 보여 준다. 맞춘다면 ‘맞았다’라는 메시지를 보여주고 종료한다. 추측 정수가 선택된 정수보다 크다면 ‘당신의 추측 숫자는 크다’라는 메시지를 보여 주고 작다면 ‘당신의 추측 숫자는 작다’라는 메시지를 보여준다. 다음으로 계속 여부를 물어보는 확인 대화 상자를 제시한다. 사용자가 ‘예’라는 단추를 누른다면 위 과정을 반복한다. '아니오'라는 단추를 누르면 종료한다.
실행한 초기 화면은 다음과 같다.
다음 두 화먼은 추측 숫자로 텍스트 필드에 10을 입력하고 확인 단추를 누른 후의 결과이다.
위 화면은 추측 숫자가 선택된 정수보다 크다는 것을 알려주는 메시지 대화 상자이다. 다음 화면은 계속 여부를 물어보는 확인 대화 상자이다.
맞췄을 때는 "맞았다"라는 메시지를 보여 주고 종료한다.
요약
• 그래픽 사용자 인터페이스는 사용자가 스크린 상에 있는 객체들과 상호작용을 하는 인터페이스이다.
• 자바에서 GUI 응용들을 지원하기 위한 클래스들은 주로 Java.awt 패키지와 javax.swing 패키지에 정의된다.
• GUI 프로그램을 작성하기 위해서는 AWT 패커지와 스윙 패키지 둘 다 필요로 한다.
• 스윙 패키지는 플랫폼 고유의 컴포넌트와 연계되지 않은 경량급의 빠른 컴포넌트들로 구성된 GUI 도구 모음이다.
• GUI의 기본 구성 요소는 컴포넌트, 컨테이너와 화면 구성 관리자이다.
• 컴포넌트는 정보를 화변에 보여 주거나 사용지가 프로그램과 어떤 방식으로 상호작용하게 하는 화면상의 요소이다.
• 컨테이너는 다른 컴포넌트들을 포함하는 특별한 유형의 컴포넌트이다. 컨테이너는 화면 구성 관리자에 의해 관리된다.
• 화면 구성 관리자는 컨테이너 내에서 컴포넌트의 위치를 결정한다.
• 프레임은 GUI 기반 응용 프로그램을 보여주기 위해 사용되는 컨테이너이다. 프레임은 자신의 제목 막대를 가진 별도의 창으로 보여진다.
• 패널은 경량급 컴포넌트들을 위한 컨테이너이다. 그러나 프레임과 달리 화면에 직접 보여질 수 없다. 패널은 보여지기 위해서 또 다른 컨테이너에 더해져야 한다.
• 컨테이너는 다른 컴포넌트들을 자신에 추가하는 add 메소드를 가진다.
• 례이블은 텍스트, 이미지 혹은 텍스트와 이미지 모두를 보여주는 컴포넌트이다.
• 단추는 사용자가 마우스의 누름으로 동작을 시작하는 컴포넌트이다.
• 텍스트 필드는 사용자가 한 줄의 입력을 하는 것을 허락하는 컴포넌트이다.
• 제크박스는 마우스를 사용하여 ON이나 OFF 상태 중의 하나를 선택하게 하는 단추이다. 라디오 단추는 한번에 한 단추만 선택될 수 있는 단추들의 그룹이다. 한 그룹에서 한 라디오 단추가 선택될 때 현재 ON 상태에 있는 라디오 단추는 OFF 상태로 바뀐다.
• 콤보박스는 ‘아래로 내리기’ 메뉴로부터 여러 선택 항목들 중의 하나를 선택하면 보여주는 컴포넌트이다.
• FlowLayout 관리자는 컴포넌트를 컨테이너 안에 줄 단위로 배열한다.
• BorderLayout 관리자는 컨테이너의 화변을 지도에서와 같이 North, South, East, West, Center 등의 다섯 개의 독립적인 영역으로 나눈다.
• GridLayout 관리자는 컨테이너의 영역을 여러 행과 여러 열로 나누게 한다,
• CardLayout 관리자는 각 컴포넌트의 크기를 컨테이너의 크기와 같게 하고 카드덱처럼 컴포넌트들을 포개 놓고 한 번에 한 컴포넌트만 화면에 보이게 한다.
• BoxLayout 관리자는 컴포넌트틀을 한 행에 수평적으로 배치하거내 한 열에 수직적으로 배치한다. 다른 화변 구성 관리자와 결합하여 아주 복잡한 화면 구성을 할 수 있다.
• 대화식 GUI 기반 응용 프로그램은 컴포넌트(들), 사건(들)과 사건 리스너(들)이 필요하다.
• 사건은 우리가 관심을 가질지 모르는 어떤 일의 발생을 나타내는 객체이다.
• 사건 리스너는 사건이 일어나기를 기다리다가 사건이 발생하면 대응하는 객체이다.
• 사건 리스너는 대응히는 컴포넌트 사이의 밀접한 관계 때문에 자주 내부 클래스로 정의된다.
• 사건 처리를 위해서는 사건이 발생되는 컴포넌트에 사건 리스너를 등록해야 한다.
토론이 없습니다