
1. JFrame -최상위 컨테이너
1. JFrame이란?
사용자 인터페이스를 구성하는 창을 생성하고 관리하는 역할을 한다. 실제로 보여지는 창이며, 여기에 다른 컴포넌트들을 추가하여 사용자와 상호작용할 수 있는 UI를 만들 수 있다. > 창의 크기, 위치 설정, 타이틀바 제목 지정, 이벤트 처리 등 가능
2. JFrame 생성 및 제목 설정

JFrame은 new 연산자를 이용해서 생성한다. > swing 패키지가 import 된 것 확인 Frame Test로 초기화하면 창제목이 Frame Test로 나온다. 저 프레임 창을 윈도우라고 부름.

아무것도 설정하지 않으면 빈 칸.

setTitle 코드로 제목을 변경할 수 있다. setSize 코드로 프레임 크기 설정. (300*200) setVisible(true) 메서드를 호출하여 창을 보이도록 설정 (객체를 화면에 표시) * setVisible 코드를 작성하지 않거나 false인 경우 > 창이 안 뜸
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 창을 닫을 때 프로그램이 종료되도록 설정. (x자 버튼 누르면 전체 프로그램이 종료되는 코드)

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 해당 코드가 없으면, 창(윈도우)은 닫히지만 프로그램은 종료되지 않고 계속 실행되고 있음.
3. JFrame 생성 - 상속ver (기본적으로 쓰는 코드)
package ex08; import javax.swing.*; public class MyFrame extends JFrame { public MyFrame() { setTitle("MyFrame"); setSize(300, 200); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { MyFrame f = new MyFrame(); } }
생성자에 MyFrame 객체를 초기화한다.
4. 프레임에 버튼 추가하기
컨테이너가 생성되었으면 이제 add() 메소드를 이용해 컴포넌트 객체들을 추가하자!

setLayout : 컨테이너(예: JFrame, JPanel)의 레이아웃 매니저를 설정하는 메서드 * 레이아웃 매니저는 컨테이너 내의 컴포넌트들을 어떤 방식으로 배치할지를 결정 (=화면 배치 구현) * setLayout 메서드를 호출하여 원하는 레이아웃 매니저를 설정
setLayout(new FlowLayout()); = 레이아웃 매니저를 FlowLayout으로 설정 * FlowLayout은 컴포넌트들을 왼쪽에서 오른쪽으로 순서대로 배치하는 레이아웃 방식
setLayout



JButton 객체를 생성하여 변수 button에 할당. 버튼의 텍스트는 "버튼"으로 설정 add 메서드를 사용하여 컴포넌트를 프레임에 추가 (버튼을 MyFrame 객체에 추가)
FlowLayout은 AWT
이렇게 버튼을 프레임에 직접 추가해서 사용하기보단
패널에 (버튼과 같은) 컴포넌트를 추가하고, 그 패널을 프레임에 추가해서 사용하자!
5. JFrame 클래스의 메소드 (주력)
add(component) : 프레임의 컨텐트 페인에 컴포넌트를 추가
setLocation(x,y), setSize(width, height) : 프레임의 위치와 크기를 설정
setIconImage(IconImage) : 윈도우의 제목줄에 표시할 아이콘을 설정
setTitle() : 제목줄의 제목 변경
setResizable(boolean) : 사용자가 윈도우의 크기를 조절하도록 허용하는지 여부 설정
getContentPane() : getContentPane() 메서드를 사용해서 프레임 안의 컨텐트 페인을 가져온다.
setLayout() : 프레임의 배치 관리자(레이아웃 매니저)를 설정
[ Content Pane ] 이란?
JFrame이나 JDialog와 같은 컨테이너의 일부분으로,
컴포넌트들을 포함하고 배치하는 역할을 담당하는 컨테이너
ex) BorderLayout, FlowLayout
6. setLayout()과 Content Pane 차이

setLayout()이 거대한 틀이고, 컨텐트 팬은 그 틀에 맞춰서 컴포넌트들을 배치하는 것
* 컨텐트 팬은 프레임 내에 컴포넌트를 배치하는 영역
7. JFrame 메소드 사용 예시

setLocation은 실행했을때, 화면의 어느 위치에 뜨는지를 지정하는 것 (800*200은 저 위치)
this.add(button1); / this.add(button2); (this는 heap 꺼!) * this는 현재 객체를 참조하는 키워드로, MyFrame 클래스 내에서 자기 자신을 가리킨다. 따라서 현재 객체인 MyFrame에 button1과 button2를 추가하는 코드. * f라는 MyFrame 클래스의 인스턴스에 button1과 button2를 추가하는 역할 -> this.add(button1); == f.add(button1);


코드
package ex08; import javax.swing.*; import java.awt.*; public class MyFrame extends JFrame { public MyFrame() { setSize(300, 150); setLocation(800, 200); setTitle("MyFrame"); setLayout(new FlowLayout()); getContentPane().setBackground(Color.pink); JButton button1 = new JButton("확인"); JButton button2 = new JButton("취소"); this.add(button1); this.add(button2); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { MyFrame f = new MyFrame(); } }
setVisible(true)위치는 꼭 맨 마지막에 실행되도록 할 것!
2. JPanel 클래스 - 최상위 컨테이너 X
1. JPanel이란?
다른 컴포넌트들을 담을 수 있는 사각형 영역·컨테이너이며, 다양한 컴포넌트들을 그룹화하여 배치하고 관리하는데 사용. * JFrame이나 다른 컨테이너에 추가되어 사용 * JFrame은 전체적인 창이나 애플리케이션의 프레임(창(window))을 담당하고, JPanel은 그 안에 들어갈 작은 영역을 구성
앞에선 버튼을 프레임에 직접 추가해서 사용했지만,
보통은 패널에 (버튼과 같은) 컴포넌트를 추가하고, 그 패널을 프레임에 추가해서 사용!
> 그렇게 해야 유지 보수 및 배치 관리에 유용함
패널도 컨테이너의 일종이므로, setLayout()을 통해 배치 관리자를 호출·설정할 수 있다.
2. JPanel 클래스의 메소드 (주력)
add(aComponent) : 패널에 컴포넌트를 추가한다
remove(aComponent) : 패널에 컴포넌트를 삭제한다
setBackground(Color c) : 패널의 배경색을 변경한다
setOpaque() : 투명도 조절 (*패널은 기본적으로 불투명)
3. 패널 사용 예시
package ex08; import javax.swing.*; import java.awt.*; public class MyFrame extends JFrame { public MyFrame() { JPanel panel = new JPanel(); //패널 생성 panel.setBackground(Color.orange); //패널 배경 변경 JButton b1 = new JButton("Button 1"); //버튼 생성 b1.setBackground(Color.blue); //버튼 배경색 변경 JButton b2 = new JButton("Button 2"); b2.setBackground(Color.green); panel.add(b1); //버튼을 패널에 추가 panel.add(b2); add(panel); //패널을 프레임에 추가 setSize(300, 150); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public static void main(String[] args) { MyFrame f = new MyFrame(); } }

4. ContentPane과 Panel의 차이

패널은 패널에 컴포넌트들을 가져다 붙인 이후, 프레임에 해당 패널을 붙임
+) 프레임이란?

Share article