본문 바로가기
java/개념

스윙 GUI 프로그램 만들기

by unhyepnhj 2024. 6. 27.

3단계 필요

  • 스윙 프레임 작성
  • main() 메소드 작성
  • 프레임에 스윙 컴포넌트 붙이기

스윙 패키지 사용을 위한 import 문

import javax.swing.*;

- 스윙 컴포넌트의 클래스 파일들이 존재하는 경로명 javax.swing.* 을 import 

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

- 대부분의 스윙 응용프로그램은 이벤트 처리, 이미지나 도형 그리기를 필수적으로 동반하므로 위와 같은 import 문이 필요한 경우가 다수


스윙 프레임과 컨텐트팬

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

- 스윙 프레임 출력 시 스윙 프레임 내에 부착된 모든 컴포넌트들이 화면에 출력

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

- 스윙 프레임이 닫히면 프레임 내의 컴포넌트들도 화면에서 사라짐

 

- 스윙에서 프레임의 역할을 수행하는 클래스가 JFrame

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

- Frame:  AWT 패키지에 있는 클래스

- 메뉴바: 메뉴들을 부착하는 공간

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


프레임 만들기, JFrame 클래스 상속

publc class MyFrame extends JFrame{
	...
}

- JFrame을 상속받아 MyFrame 클래스 생성

MyFrame frame = new MyFrame();	//스윙 프레임 생성

- MyFrame 객체가 생성되면 스윙 프레임의 역할을 하게 됨

- MyFrame 클래스에 main() 메소드를 두고 main()에서 MyFrame 객체를 생성하면 스윙 프레임이 만들어짐

setTitle("스윙 프레임");	//프레임 타이틀 설정
setSize("300*300");	//프레임 크기 설정
setVisible("true");	//프레임이 출력되도록 지시(false인 경우 프레임 출력되지 않음)

- MyFrame() 생성자에서 프레임의 크기와 타이틀 설정

- setTitle(), setSize(), seVisible() 메소드는 모두 JFrame의 멤버

- setSize()를 호출하지 않으면 프레임의 크기가 0*0이 되어 출력되지 않음

- setVisible(true)을 호출하지 않는다면 프레임의 디폴트 속성이 invisible이므로 화면에 출력되지 않음

- MyFrame 객체가 생성되면 스윙 프레임이 화면에 출력되고, 키나 마우스 입력을 받으며 스스로 동작


스윙 응용프로그램에서 main() 메소드의 기능과 위치

- main()의 기능은 최소화하는 것이 좋음

- main()에는 프레임을 생성하는 코드 정도만 만들고 나머지 기능은 프레임 클래스에 작성하는 것을 권장

import javax.swing.*;

public class MyFrame extends JFrame{
	public MyFrame(){
    	...
    }
    public static void main(String[] args){
    	MyFrame frame=new Frame();	//프레임 생성 코드
    }
}

프레임에 컴포넌트 붙이기

 

타이틀 달기

public MyFrame(){
	super("타이틀 문자열");		//case 1: JFrame("타이틀 문자열") 생성자를 호출하여 타이틀 부착
   	setTitle("타이틀 문자열");	//case 2: 메소드를 호출하여 타이틀 달기
}

- super()를 이용하여 JFrame의 생성자를 호출하거나

- JFrame 클래스의 setTitle() 메소드 이용

 

메뉴 붙이기

- 나중에 다시 설명하겠습니다(라고 교재에 되어 있네요...ㅜ)

 

컨텐트팬에 컴포넌트 달기

- 스윙에서는 컨텐트팬에만 컴포넌트 부착 가능

- JFrame 객체가 생길 때 컨텐트팬이 자동으로 생성

- JDK 1.5부터 add() 메소드가 컴포넌트를 컨텐트팬에 대신 부착

public class MyFrame extends JFrame{
	public MyFrame(){
    	...
        Container contentPane = getContentPane();
        //프레임에 부착된 컨텐트팬 알아냄
    }
    ...
}

- 현재 프레임에 붙어 있는 컨텐트팬을 알아내기 위해 JFrame 클래스의 getContentPane() 메소드를 호출

- 컨텐트팬은 Container 타입

JButton button = new JButton("Click");	//버튼 컴포넌트 생성
contentPane.add(button);	//생성한 버튼 컴포넌트를 컨텐트팬에 부착

- add() 메소드를 이용하여 컨텐트팬에 컴포넌트 부착

- 컨텐트팬에 부착된 컴포넌트들은 프레임 출력 시 함께 화면에 출력됨

 

컨텐트팬 변경

- JFrame 클래스의 setContentPane() 메소드를 이용해 프레임에 부착된 컨텐트팬을 제거하고 새로운 컨텐트팬을 붙임

- 컨텐트팬은 Container 타입이므로 Container를 상속받은 어떤 컨테이너도 컨텐트팬이 될 수 있음

class MyPanel extends JPanel{
	//JPanel을 상속받은 패널 작성
}
frame.setContentPane(new Panel());	//프레임의 컨텐트팬을 MyPanel 객체로 변경

스윙 응용프로그램의 종료

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

- 어떤 상황에서든 프로그램 종료를 위해 위 코드를 사용하면 된다

 

- 프레임 윈도우의 오른쪽 상단에 있는 × 버튼은 프레임 윈도우를 닫는 버튼

- 프로그램을 종료시키는 버튼이 아님

- × 버튼을 클릭하면 프레임은 화면에서 사라지지만 프로그램은 종료되지 않음

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//프레임이 닫힐 때 프로그램도 종료

- 프레임 윈도우가 닫힐 때 스윙 프로그램을 함께 종료시키려면 위 코드를 삽입

 

+ main() 메소드가 종료된 뒤에도 프레임이 유지되는 이유

- 이전에 다룬 콘솔 응용프로그램에서는 main() 메소드가 종료되면 자바 응용프로그램이 종료

- 스윙 응용프로그램에서는 main() 메소드가 종료돼도 프레임 윈도우가 계속 작동

 

- 자바 응용프로그램이 시작되면 JVM은 main 스레드를 만들고 main()을 실행

※스레드(thread): 프로그램 코드를 실행하는 제어

- 응용프로그램이 스레드를 만들지 않는 경우 main()이 종료되면 main() 스레드도 종료

- 이 경우 더 이상 살아 있는 스레드가 없기 때문에 응용프로그램이 종료

 

- 스윙에서 JFrame 객체가 생성되면 main 스레드 외에 이벤트 처리(분배) 스레드(Event Dispatch Thread)가 자동으로 추가 생성

- main 스레드가 종료되어도 이벤트 처리 스레드가 남아 있으므로 자바 응용프로그램은 종료되지 않고 사용자로부터 키와 마우스 입력을 계속 처리


예제 9-1 300*300 사이즈의 스윙 프레임 작성

 

예제 9-2 컨텐트팬의 배경색을 오렌지색으로 하고, 이곳에 OK, Cancel, Ignore 버튼을 부착한 스윙 프로그램 작성

'java > 개념' 카테고리의 다른 글

배치관리자  (0) 2024.06.28
컨테이너와 배치  (0) 2024.06.28
자바 GUI 패키지  (0) 2024.06.27
GUI  (0) 2024.06.27
파일 입출력 응용: 파일 복사  (0) 2024.06.24