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 |