CHAPTER 09 자바 GUI 기초, AWT와 스윙(Swing)
9.1 자바의 GUI
9.2 자바 GUI 패키지
9.3 스윙 GUI 프로그램 만들기
9.4 컨테이너(Container)와 배치(Layout)
9.5 FlowLayout 배치관리자
9.6 BorderLayout 배치관리자
9.7 GridLayout 배치관리자
9.8 배치관리자 없는 컨테이너



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


public MyFrame() { //생성자
super("타이틀 문자열"); // 방법 1 : JFrame 의 생성자 호출하여 타이틀 닫기
setTitle("타이틀 문자열"); // 방법 2: 메소드를 호출하여 타이틀 닫기
}
//프레임의 컨텐트팬을 알아낸다: 컴퓨터가 생성한 기본 프레임에 컴포넌트를 달기 위함!
Container contentPane = frame.getContentPane();
Container contentPane = getContentPane();
//이 둘의 차이점
//첫번째 코드는 frame 이라는 JFrame 객체를 사용하여 컨텐트 팬을 얻는 방법
//두번쨰 코드는 현재 클래스의 인스턴스 메소드인 getContentPane() 메소드를 직접 호출
// - 이 코드가 작성된 위치가 JFrame 하위 클래스 내부인 경우에 주로 사용됨
FlowLayout : 적당한 위치에 하나씩 배치시켜줌 -> awt 패키지에 구현되어있음
컨텐트팬에 컴포넌트 부착하기
Container c = frame.getContentPane(); //컨탠트팬 c 를 얻어오고
JButton b = new JButton("Click"); //버튼을 생성
c.add(b); //참조변수를 add 하여 컨텐트 팬에 버튼을 추가!
JPanel p = new JPanel(); //프레임에 부착할 수 있는 패널은 여러 개 가능
frame.setContentPane(p); //따라서, 해당 프레임에 다른 패널을 추가로 생성해서 부착한 것과 유사한 의미!
import javax.swing.*;
import java.awt.*;
public class ContentPaneEx extends JFrame {
ContentPaneEx(){
setTitle("ContentPane 과 JFrame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //x 버튼을 누르면 화면에서 지워지는것에 추가로
//시스템에서 프로그램이 종료되도록
//설정하느 코드
Container contentPane = getContentPane(); //컨텐트 팬 가져오기
contentPane.setBackground(Color.ORANGE);
contentPane.setLayout(new FlowLayout()); //버튼 위치를 지정하는 레이아웃
contentPane.add(new JButton("OK"));
contentPane.add(new JButton("Cancel"));
contentPane.add(new JButton("Ignore"));
setSize(350, 150);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new ContentPaneEx();
//현재 프레임에는 컨텐트 팬이 하나이기 때문에
//ContentPaneEx ref = new ContentPaneEx()
//로 수행하지 않아도 됨
// -> (참조변수를 활용하여 수행할 내용이 없음)
}
}

System.exit(0); //언제 어디서나 무조건 종료
// ** 중요 **
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
컨테이너마다 하나의 배치관리자가 존재하며,
삽입되는 모든 컴포넌트의 위치와 크기를 결정하고 적절히 배치한다.
컨테이너의 크기가 변하면 내부 컴포넌트들의 위치와 크기를 모두 재절하고 재배치한다.


//JPanel 패널에 BorderLayout
//배치 관리자를 설정하는 예
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
//컨텐트팬의 배치 관리자를 FlowLayout 으로 변경
Container c = frame.getContentPane(); //프레임의 컨텐트팬
c.setLayout(new FlowLayout()); //컨텐트팬에 FlowLayout 변경container.setLayout(new FLowLayout());
container.add(new JButton("add"));
container.add(new JButton("mul"));
...
import javax.swing.*;
import java.awt.*;
public class FlowLayoutEx extends JFrame {
FlowLayoutEx(){
setTitle("FlowLayout Sample");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
//FlowLayout.LEFT 로 정렬, hGap : 30픽셀, vGap : 40픽셀
c.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 40));
c.add(new JButton("add"));
c.add(new JButton("sub"));
c.add(new JButton("mul"));
c.add(new JButton("div"));
c.add(new JButton("Calculate"));
setSize(350, 250);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new FlowLayoutEx();
}
}


container.setLayout(new BorderLayout());
container.add(new JButton("div"), BoerderLayout.WEST);
container.add(new JButton("Calculate"), BoerderLayout.CENTER);

import javax.swing.*;
import java.awt.*;
public class BorderLayoutEx extends JFrame {
BorderLayoutEx(){
setTitle("BorderLayout Sample"); //프레임의 타이틀 달기
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //프레임 윈도우를 닫으면 프로그램 종료
Container c = getContentPane(); //컨텐트팬 얻어오기
c.setLayout(new BorderLayout(30,20)); //컨텐트팬에 BorderLayout 배치관리자 설정
//컴포넌트 추가
c.add(new JButton("Calculate"), BorderLayout.CENTER);
c.add(new JButton("add"), BorderLayout.NORTH);
c.add(new JButton("sub"), BorderLayout.SOUTH);
c.add(new JButton("mul"), BorderLayout.EAST);
c.add(new JButton("div"), BorderLayout.WEST);
setSize(300, 200); //프레임 크기 300x200 설정
setVisible(true); //프레임을 화면에 출력
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new BorderLayoutEx();
}
}

//4 x 3 그리드 분할로 컴포넌트 배치
//수평간격 hGap : 5픽셀, 수직간격 vGap : 5픽셀
container.setLayout(new GridLayout(4,3,5,5));
//상단 왼쪽 첫 번째 셀에 버튼 배치
container.add(new JButtom("1"));
container.add(new JButtom("2")); //그 옆 셀에 버튼 배치
...
import javax.swing.*;
import java.awt.*;
public class GridLayoutEx extends JFrame {
GridLayoutEx(){
setTitle("GridLayout Sample");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridLayout grid = new GridLayout(4,2);
grid.setVgap(5);
setLayout(grid);
add(new JLabel("이름"));
add(new JTextField(""));
add(new JLabel("학번"));
add(new JTextField(""));
add(new JLabel("학과"));
add(new JTextField(""));
add(new JLabel("과목"));
add(new JTextField(""));
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new GridLayoutEx();
}
}

Container.setLayout(null) 로 설정해놓고 우리가 위치 정보를 다음과은 setSize, setLocation, setBounds 등으로 설정한다.//JPanel 에 배치관리자를 삭제하는 예
JPanel p = new JPanel();
p.setLayout(null);Component.setSize(int width, int height);Component.setLocation(int x, int y);Component.setBounds(int x, int y, int width, int height);import javax.swing.*;
import java.awt.*;
public class NullContainerEx extends JFrame {
NullContainerEx(){
setTitle("Null Container Sample");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(null);
JLabel la = new JLabel("Hello, Press Buttons!");
la.setLocation(130, 50); //la 는 130, 50 위치에 hello~ 내보내짐
la.setSize(200, 20);
c.add(la);
//for 문을 사용하여 9개의 버튼(사이즈는 똑같음) 생성
for(int i=1; i<=9; i++) { //증가하면서 해당하는 위치에 등록
//i 를 문자열로 바꿔라 라는 메소드
JButton b = new JButton(Integer.toString(i)); //버튼 생성!
b.setLocation(i*15, i*15);
b.setSize(50,20);
c.add(b);
}
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new NullContainerEx();
}
}
// 원하는 위치에 원하는 크기로 컴포넌트를 마음대로 배치
