본문 바로가기

카테고리 없음

스윙 GUI 프로그램 만들기, 명품 자바 프로그래밍 8장

728x90
반응형

* 스윙으로 GUI 응용프로그램을 만들기 위한 과정 3가지

1) 스윙 프레임 작성

2) main() 메소드 작성

3) 프레임에 스윙 컴포넌트 붙이기

스윙 패키지를 이용하기 위해서는 스윙 컴포넌트의 클래스 파일들이 존재하는 경로명 javax.swing.*를 import 해야 한다.

import javax.swing.*;

대부분의 Swing 응용프로그램은 이벤트 처리, 이미지나 도형을 그리는 부분을 필수적으로 동반하므로 imprt문이 필요한 경욱 많다.

import java.awt.*; // 폰트 등 그래픽 처리를 위한 클래스들의 경로명
import java.awt.event.*; // 이벤트 처리에 필요한 기본 클래스들의 경로명
import javax.swing.*; // 스윙 컴포넌트 클래스들의 경로명
import javax.swing.event.*; // 스윙 이벤트 처리에 필요한 클래스들의 경로명

 

* 스윙 프레임은 모든 스윙 컴포넌트들을 담는 최상위 컨테이너(Top Level Container)이다.

스윙 프레임이 출력될 때, 스윙 프레임 내에 부착된 모든 컴포넌트들이 화면에 출력된다.

컴포넌트들은 스윙 프레임 없이 독립적으로 화면에 출력될 수 없다.

스윙 프레임이 닫히면 프레임 내의 모든 컴포넌트들도 프레임과 함께 화면에서 사라진다.

 

* 스윙에서 프레임의 역할을 수행하는 클래스가 JFrame이다.

Swing 프레임(JFrame)의 구성

*JFrame 객체는 Frame(java.awt.Frame), 메뉴바(Menu Bar), 컨텐트팬(Content Pane)의 3공간으로 구성된다.

Frame은 AWT 패키지에 있는 클래스로서 JFrame이 상속받기 때문에 당연히 그 속성들이 존재하며, 메뉴바는 메뉴들을 부착하는 공간이다.

컨텐트팬은 메뉴를 제외한 모든 GUI 컴포넌트들을 부착하는 공간이다.

스윙 응용프로그램 개발자는 메뉴를 만들어 JFrame의 메뉴바에 부착하여야 하며, 화면에 출력하고자하는 GUI 컴포넌트들은 모두 컨텐트팬에 부착하여야 한다.

 

* 300x300 크기위 스윙 프레임 만들기

package Ch0901Ex;
import javax.swing.*;
public class Ch0901Ex extends JFrame{
	public Ch0901Ex() {
		setTitle("300x300 스윙 프레임 만들기");
		setSize(300, 300); // 프레임 크기 300x300
		setVisible(true); // 프레임 출력
	}
	
	public static void main(String[ ] args) {
		Ch0901Ex frame = new Ch0901Ex();
	}
}

 

* setTitle(), setSize(), setVisible() 메소도는 모두 JFrame의 멤버이다.

setSize(300, 300)을 호출하지 않으면 프레임의 크기가 0 x 0이 되어 화면에 출력되지 않는다.

setVisible(true)를 호출하지 않는다면 프레임의 디폴트 속성이 invisible(보이지 않는 상태)이므로 화면에 출력되지 않는다.

 

* Swing 응용프로그램에서 main()의 기능은 최소화하는 것이 좋다.

main()에는 스윙 응용프로그램이 실행되는 시작점으로서 프레임을 생성하는 코드 정도만 만들고, 나머지기능은 프레임 클래스에 작성하는 것이 좋다.

 

* 프레임은 응용프로그램을 구성하는 바탕 틀이다.

* 3개의 버튼 컴포넌트를 가진 스윙 프레임 만들기

package ContentPaneEx;
import javax.swing.*;
import java.awt.*;
public class ContentPaneEx extends JFrame{
	public ContentPaneEx() {
		setTitle("Contentpane과 JFrame"); // 프레임 타이틀 달기
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 프레임 윈도우를 닫으면 프로그램을 종료하도록 설정
		
		Container contentPane = getContentPane(); // 컨텐트 팬을 알아낸다.
		contentPane.setBackground(Color.ORANGE); // 컨텐트팬의 색을 오랜지 색으로
		contentPane.setLayout(new FlowLayout()); // 컨텐트팬에 FlowLayout 배치관리자 달기
		
		contentPane.add(new JButton("OK")); // OK 버튼 달기
		contentPane.add(new JButton("Canle")); // Cancle 버튼 달기
		contentPane.add(new JButton("Ignore")); // Ignore 버튼 달기
		
		setSize(300, 150); // 프레임 크기 300x150 설정
		setVisible(true); // 화면에 프레임 출력
	}
	
	public static void main(String[] agrs) {
		new ContentPaneEx();
	}
}

* 자바에서 프래그램을 종료하려면 어떤 상황에서나 System.exit(0); 코드를 사용한다.

System.exit(0); // 자바 프로그램을 종료한다.

한편 프레임 윈도우의 오른쪽 상단에 있는 '프레임 종료 버튼(X)'은 프레임 윈도우를 닫는 버튼이지 프로그램을 종료시키는 버튼은 아니다.

클릭하면 프레임이 화면에서 사라지지만 프로그램은 종료되지 않고 살아 있다. 

프레임 윈도우가 닫힐 때 수윙 프로그램도 함께 종료시키고자 한다면 JFrame.EXIT_ON_CLOSE 코드를 삽입 해야 한다.

frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); 
// 프레임이 닫힐 때 프로그램도 함께 종료한다.

 

* Swing 응용프로그램에서는 main() 메소드가 종료되어도 프레임 윈도우가 살아서 작동한다.

자바 응용 프로그램이 시작되면 자바 가상 기계는 main 스레드를 만들고 main()을 실행시킨다.

응용프로그램이 스레드를 만들지 않는 경우, main()이 종료되면 main 스레드도 종료되며, 더 이상 살아 있는 스레드가 없기 떄문에 이 응용프로그램은 종료하게 되는 것이다.

그러나 스윙에서 JFrame 객체가 생성되면 main 스레드 외에, 입력되는 키와 마우스의 움직임을 컴포넌트에게 이벤트로 전달하는 이벤터 처리(분배) 스레드(Event Dispatch Thread)가 자동으로 추가 생성된다.

그러므로 main 스레드가 종료하더라도 이벤트 처리 스레드가 살아 있기 때문에, 자바 응용프로그램은 종료되지 않고 사용자로부터 키와 마우스 입력을 계속 처리하게 되는 것이다.

반응형