728x90
반응형
지난 포스트에서 SWING으로 만드는 자바 GUI 방식의 대략적인 개요를 살펴봤습니다. 이번 시간에는 각 컴포넌트들을 윈도우 화면에 띄우는 방법을 배워봅시다.
https://daradarav.tistory.com/35
📌 기본 프로그램 구성
📚 Swing 프로그램 만들기
📃 프레임 객체 생성
import javax.swing.JFrame;
- 최상위 컨테이너 윈도우 프레임
- 화면을 구성하고, 각 화면에서 이벤트 처리를 합니다.
📃 프레임에 스윙 컴포넌트 붙이기
import javax.swing.*; // 생성
import java.awt.*; // 배치
📃 이벤트 처리
import java.awt.event.*;
import javax.swing.event.*;
- 이벤트 처리는 주로 awt 를 사용합니다
- 새로 추가된 이벤트의 경우는 swing 을 통해 처리합니다.
📃 프레임 가시화
📚 프레임 만들기
- 일반적으로 하나의 응용프로그램에 하나의 프레 임 존재
- 모든 스윙 컴포넌트를 담는 최상위 컨테이너 중 하나인 JFrame 이용
- JFrame에는 다수의 컴포넌트들을 직접, 간접적으로 부착
- 프레임이 닫히면 프레임 내의 모든 컴포넌트도 사멸하여 화면에서 사라짐
📚 JFrame 클래스
- 일반적인 응용프로그램 윈도우를 생성하기 위해 사용
- 경계선(Border), 타이틀, 시스템 상자 제공
- 메뉴를 붙일 수 있음
- 윈도우 위치/크기 설정: setLocation() / setSize() / setBounds()
- 윈도우를 화면에 표시 : setVisible()
📚 JFrame 클래스의 구성
JFrame 클래스는 네 개의 pane이 층으로 구성되어 있습니다.
- glassPane
- contentPane
* 일반적인 컴포넌트들을 갖는 패널
* JDK 5.0 이후에선 add() 메서드 호출만으로 바로 컴포넌트를 붙일 수 있음 - layeredPane
* contentPane, JMenuBar를 포함 - JRootPane
📚 프레임 생성 방법 (1)
- 작성하고자 하는 클래스에서 JFrame 객체를 생성하여 사용
- 생성된 JFrame 객체를 윈도우를 나타내는데 이용
import javax.swing.JFrame;
public class JavaFrame {
JFrame frame;
public JavaFrame() {
// frame = new JFRame();
// frame.setTitle("Frame Test");
frame = new JFrame("Frame Test");
// ...
frame.setSize(200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String[] args) {
JavaFrame hello = new JavaFrame();
}
}
- JFrame의 객체를 생성하고 메서드를 사용하여 setTitle로 제목을 설정할 수 있음
- JFrame을 생성하면서 인자로 제목을 설정할 수 있음
- setSize로 크기를 설정하고, setLocation으로 위치를 설정할 수 있음
- setBounds로는 크기와 위치를 모두 설정할 수 있음
- setVisible을 통해 가시화 작업을 함
📚 프레임의 [종료] 버튼 처리
- 기본적으로 프레임 숨김 동작을 처리
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
- 프레임을 바로 종료하기 위해선
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- 프레임 종료시에 임의의 작업 필요시에는 WindowEvent에 대한 처리로 해결
System.exit(0);
📚 스윙 응용프로그램에서 main( )의 기능
- 스윙 응용프로그램이 실행되는 시작점으로서의 기능
- 프레임 객체를 생성하는 정도의 코드로 역할 최소화
- 화면 구성 및 이벤트 처리는 모두 프레임 이하 객체들이 담당하도록 구성하는 것이 바람직
- 프레임 객체를 참조변수로 받을 필요 없이 바로 객체를 생성하여 처리
📚 main( ) 메서드 종료 vs 프로그램 종료
- 콘솔 응용 프로그램
- main() 메서드 실행시 main 스레드가 생성되어 처리 됨
- Swing 응용 프로그램
- main() 메서드 실행시 main 스레드가 생성
- 이때 JFrame 객체 생성시 추가적으로 이벤트 처리 스레드가 생성되어 사용됨
- 사용자 입력으로부터 발생되는 각 이벤트를 해당 컴포넌트에 전달
- 프로그램은 두 스레드가 모두 종료시에 종료됨
📚 프레임 생성 방법 (2)
- 작성하고자 하는 클래스를 JFrame으로부터 상속 받아 사용
- 작성한 클래스의 객체 자신이 JFrame 객체
import javax.swing.*;
public class JavaFrame extends JFrame{
public JavaFrame() {
super("Frame Test2");
// ...
setSize(200, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
JavaFrame hello = new JavaFrame();
}
}
📌 배치관리자
📚 프레임에 컴포넌트 붙이기
📃 타이틀 달기
- 생성자의 인수로 지정
- JFrame의 setTitle() 이용
📃 메뉴
- JFrame의 layeredPane에 별도 방법으로 부착
📃 스윙 컴포넌트
- JFrame의 contentPane에 add()로 부착
- Container contentPane = frame.getContentPane();
contentPane.add(...); - JDK 5.0이후엔 frame에 대해 add() 호출 허용
📚 컨테이너와 배치
- 객체의 도움을 받아 배치하게 되는데 부착될 컴포넌트의 위치와 크기를 지정함
- 각 컨테이너마다 기본 배치관리자가 존재
- 내부 컴포넌트의 크기와 위치를 적절히 결정
- 컨테이너의 크기 변경시 내부 컴포넌트의 위치와 크기를 재조절
📚 배치 관리자 (Layout Manager)
- 미리 정의된 방법에 따라 각 컴포넌트를 컨테이너의 정해진 위치에 붙여주는 객체
- 기본 배치 관리자는 컨테이너 생성 시 자동으로 생성되는 배치관리자
- JFrame, JDialog : BorderLayout
- JPanel, JApplet : FlowLayout
- 각 컨테이너에 새로운 배치 관리자 적용 가능
- setLayout(LayoutManager lm) 메서드
📚 배치 관리자의 종류
📃 FlowLayout
- 상단 중앙부터, 수평우선(좌→우)으로 배치
- 배치 공간 부족시 아래로 내려와 반복
- 가운데 정렬
- 프레임 폭이 지정되어 있어 넘칠 경우 다음 주로 넘어감
📃 BorderLayout
- 영역을 5개 영역으로 분할하여 각 영역에 배치
- CENTER(기본 영역), NORTH, SOUTH, WEST, EAST
- 영역에 대한 지정은 따로 해줘야함
- 한 영역에 하나씩만 붙음
📃 GridLayout
- 일정한 크기의 격자모양으로 나누어 배치(좌→우, 상→하)
- 화면을 모눈 종이처럼 영역을 나누어 배치
- 한 영역에 하나씩만 붙음
📃 CardLayout
- 한 순간에 하나의 컴포넌트만 표시
📚 JPanel 클래스
- 컴포넌트를 그룹별로 묶어서 처리할 때 주로 사용
- 하나 이상의 패널은 다른 패널에 붙일 수 있음
- 패널간의 계층적 구성이 가능
- 일반적인 윈도우 구성
- 각 컴포넌트를 배치 그룹별로 각각의 패널에 붙이고, 그 패널들을 또다른 패널 혹은 프레임에 붙임
📚 배치 관리자의 적용
- 컨테이너에 특정 배치 관리자의 적용
- Container 클래스의 setLayout() 메서드 인자로 지정
예1) FlowLayout 배치에서 왼쪽정렬 설정 방법
p.setLayout(new FlowLayout(FlowLayout.LEFT));
예2) p를 BorderLayout으로 설정
p.setLayout(new BorderLayout());
📚 배치관리자가 없는 컨테이너
- 컴포넌트의 크기와 위치를 직접 지정
- 사용자 입력에 따라 컴포넌트 위치/크기가 수시로 변경되는 경우
- 배치관리자 객체 지정대신 null 지정
- 해당 컨테이너에 속하는 모두 컴포넌트에 대해 크기와 위치를 직접 지정해야 함
- setSize(), setLocation(), setBounds()
반응형
'코딩언어 > JAVA' 카테고리의 다른 글
[JAVA] 15 이벤트 처리 (0) | 2022.11.17 |
---|---|
[JAVA] 14-1 Swing의 기본 특징 (0) | 2022.11.08 |
[JAVA] 13. 제네릭과 컬렉션 (0) | 2022.11.05 |
[JAVA] 12. 예외처리 (0) | 2022.11.04 |
[JAVA] 11 추상 클래스와 인터페이스 (0) | 2022.11.03 |