결국 컨테이너는 컴포넌트를 담아낼 큰 틀이라고 보는게 좋다
컴포넌트는 그 안의 컨텐츠들
ex) 버튼, Frame 등등...
import java.awt.*; //그래픽 처리를 위한 클래스들의 경로명
import java.awt.event.*; //AWT 이벤트 사용을 위한 경로명
import javax.swing.*; //스윙 컴포넌트 클래스들의 경로명
import javax.swing.event.*; //스윙 이벤트를 위한 경로명
import javax.swing.*;
public class MyFrame extends JFrame{ //JFrame을 상속받은 MyFrame작성
public MyFrame(){ //생성자
setTitle("300x300 스윙 프레임 만들기"); //타이틀 설정
setSize(300, 300); //프레임 크기 설정
setVisible(true); //프레임을 화면에 출력
}
public static void main(String[] args){ //실제 실행될 메인함수
MyFrame mf = new MyFrame(); //MyFrame객체 생성, 즉 스윙프레임 생성
}
}
이 코드는 단순히 프레임을 만들어내는 코드이다.
보다시피 MyFrame이라는 생성자를 만들고, 사이즈와 화면에 출력하는 setSize와 setVisible 메서드만 사용해서 뽑아내고있다
그리고 메인함수에 MyFrame의 객체를 만들어서 실행시키면 끝!
이렇게 실행된다!
결국 컨텐트팬은 스윙 프레임이랑 역할이 비슷하다는건데, 굳이 따로 개념이 존재하는 이유가 뭘까?
일단, 기본적으로 스윙프레임은 컨텐트팬을 모두 포함하고 있다
그래서! 굳이 컨탠트팬을 코드에 나타내지 않아도 다른 컴포넌트들을 넣을 수 있다!그런데도 굳이 컨탠트팬을 쓰는 이유는,
- 컨텐트팬을 다른 컨테이너로 교체할 수 있다:
기본적으로 JPanel 이지만, setContentPane()메서드를 사용하여 다른 컨테이너로 컨텐트팬을 교체 할 수 있다!- 컨텐트팬의 속성을 수정할 수 있음:
컨텐트팬은 getContentPane()을 통해 직접 접근이 가능하다.
그렇게 컨텐트팬에 대한 속성을 수정할 수 있다- 일부 레거시 코드와의 호환성을 유지할 수 있음
뭐 대충 이런 이유로! 컨탠트팬을 사용하는것이다. 이제 예시 코드를 한번 확인하자
import javax.swing.*;
import java.awt.*;
public class ContentPaneEx extends JFrame{
public ContentPaneEx(){
setTitle("ContentPane과 JFrame 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane(); //현재 스윙프레임의 컨텐트팬 알아내기
contentPane.setBackground(Color.ORANGE); //그 컨텐트팬의 배경색 설정
contentPane.setLayout(new FlowLayout()); //컨텐트팬에 FlowLayout 배치관리자 달기
//FlowLayout은 나중에 배울것!
contentPane.add(new JButton("OK")); //OK버튼 달기
contentPane.add(new JButton("Cancel")); //Cancel 버튼 달기
contentPane.add(new JButton("Ignore")); //Ignore 버튼 달기
setSize(300,150); //프레임 크기 설정
setVisible(true); //프레임 출력
}
public static void main(String[] args){
new ContentPaneEx();
}
}
예시코드에서 FlowLayout이 뭔지 궁금할것이다! 바로 배워보자
자! 글을 읽고 그림도 봤으면 대충~ 느낌은 잡힐것이다 그래도 한번 확인해보자!
import javax.swing.*;
import java.awt.*;
public class FlowLayoutEx extends JFrame{
public FlowLayoutEx(){
setTitle("FlowLayout 예제"); //프레임 이름 설정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //스윙 프레임을 닫을때 프로그램을 종료합니다
Container contentPane = getContentPane(); //현재 컨텐트팬 알아내기
contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 40));
//왼쪽정렬, 수평간격 30, 수직간격 40
contentPane.add(new JButton("add")); //add라는 버튼 추가
contentPane.add(new JButton("sub")); //sub라는 버튼 추가
contentPane.add(new JButton("mul")); //mull이라는 버튼 추가
contentPane.add(new JButton("div")); //div라는 버튼 추가
contentPane.add(new JButton("Calculate")); //Calculcate라는 버튼 추가
setSize(300, 200);
setVisible(true);
}
public static void main(String[] args){
new FlowLayoutEx();
}
}
보다시피, 그냥 간격만 정해져있고 순서대로 버튼을 배치하는것 뿐이다
대충 FlowLayout 배치관리자에 대한 이해가 충분히 됐을것이다!
import javax.swing.*;
import java.awt.*;
public class BorderLayoutEx extends JFrame{
public BorderLayoutEx(){
setTitle("BorderLayout 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = get ContentPane();
contentPane.setLayout(new BorderLayout(30, 20));
contentPane.add(new JButton("Calculate"), BorderLayout.CENTER);
contentPane.add(new JButton("add"), BorderLayout.NORTH);
contentPane.add(new JButton("sub"), BorderLayout.SOUTH);
contentPane.add(new JButton("mul"), BorderLayout.EAST);
contentPane.add(new JButton("div"), BorderLayout.WEST);
setSize(300, 200);
setVisible(true);
}
public static void main (String[] args){
new BorderLayoutEx();
}
}
동서남북으로 나눠서 컴포넌트를 배치하는 방식.
번외로 이렇게 만들려면, East가 아닌 Center을 남겨야한다. East로 하면?
이렇게 된다
import java.awt.*;
import javax.swing.*;
public class GridLayoutEx extends JFrame{
public GridLayoutEx(){
super("GridLayout 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new GridLayout(1,10));
for(int i = 0; i < 10; i++){
String text = Integer.toString(i);
JButton button = new JButton(text);
contentPane.add(button);
}
setSize(500, 200);
setVisible(true);
}
public static void main(String[] args){
new GridLayoutEx();
}
}
보다시피 1행 10열의 칸으로 나뉘어서 배치된걸 볼 수 있다
import javax.swing.*;
import java.awt.*;
public class NullContainerEx extends JFrame{
public NullContainerEx(){
setTitle("배치관리자 없이 절대 위치에 배치하는 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(null); //컨텐트팬의 배치관리자 제거
JLabel la = new JLabel("Hello, PressButtons!");
la.setLocation(130,50);
la.setSize(200, 20);
contentPane.add(la);
for(int i = 1; i <= 9; i++){
JButton b = new JButton(Integer.toString(i));
b.setLocation(i*15, i*15);
b.setSize(50,20);
contentPane.add(b);
}
setSize(300,200);
setVisible(true);
}
public static void main(String[] args){
new NullContainerEx();
}
}
배치관리자를 없애고, 직접 컴포넌트의 절대 크기와 위치를 설정 할 수 있다
- 컴포넌트들이 서로 겹치게도 가능!
void setSize(int width, int height) //컴포넌트 크기 설정 void setLocation(int x, int y) //컴포넌트 위치 설정 void setBounds(int x, int y, int width, int height) //위치와 크기 동시 설정
보다시피 컴포넌트들이 저렇게 겹쳐서 배치가 된다!
import javax.swing.*;
import java.awt.*;
public class LabelEx extends JFrame{
public LabelEx(){
setTitle("레이블 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JLabel textLabel = new JLabel("제임스 고슬링 입니더!");
ImageIcon img = new ImageIcon("images/gosling.jpg");
JLabel imageLabel = new JLabel(img);
ImageIcon icon = new ImageIcon("images/icon.gif");
JLabel label = new JLabel("커피한잔 하실래예, 전화주이소", icon, SwingConstants.CENTER);
c.add(textLabel);
c.add(imageLabel);
c.add(label);
setSize(300, 500);
setVisible(true);
}
public static void main(String [] args){
new LabelEx();
}
}
JButton() //빈버튼
JButton(Icon image) //이미지 버튼
JButton(String text) //문자열 버튼
JButton(String text, Icon image) //문자열과 이미지 모두 가진 버튼
선택과 비선택 두 상태만 가지는 버튼
체크박스 생성
JCheckBox() //빈 체크박스
JCheckBox(Icon image)//이미지 체크박스
JCheckBox(Icon image, boolean selected)//이미지 체크박스
JCheckBox(String text, Icon image)//문자열과 이미지를 가진 체크박스
JCheckBox(String text, Icon image, boolean selected)//문자열과 이미지 체크박스
한 줄의 문자열을 입력 받는 창
텍스트 입력 도중 "Enter"키가 입력되면 Action 이벤트 발생
입력 가능한 문자 개수와 입력창의 크기는 다름
텍스트필드 생성
JTextField() //빈 텍스트 필드
JTextField(int cols) //입력 창의 열의 개수가 cols개인 텍스트 필드
JTextField(String texdt) //text문자열로 초기화된 텍스트필드
JTextField(String text, int cols) //입력창의 열의 개수는 cols개이고 text문자열로 초기화된 텍스트필드
여러 줄의 문자열을 입력받을 수 있는 창(텍스트 영역)
스크롤바 지원x
JScrollPane 객체에 삽입하여 스크롤바 지원
TextArea생성
JTextArea() //빈 텍스트영역
JTextArea(int rows, int cols) //입력 창이 rowsxcols개의 문자 크기인 텍스트 영역
JTextArea(String text) //text문자열로 초기화된 텍스트 영역
JTextArea(String text, int rows, int cols) //입력창이 rowsxcols개의 문자 크기이며
//text문자열로 초기화된 텍스트 영역
JList<E>() //빈 리스트
JList(Vector listData) //벡터로부터 아이템을 공급받는 리스트
JList<E>(Object [] listData) //배열로부터 아이템을 공급받는 리스트
ex) 9개의 과일 이름 문자열이 든 리스트 만들기
String [] fruits = {"apple", "bannana", "kiwi", "mango", "pear", "peach", "berry", "strawberry", "blackberry"};
JList<String> strlist = new JList<String>(fruits);
import java.awt.*;
import javax.swing.*;
public class PanelEx extends JFrame{
public PanelEx(){
setTitle("Panel Example");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new BorderLayout());
JPanel p = new JPanel();
JLabel l1 = new JLabel("Test");
JLabel l2 = new JLabel("Test1");
p.setLayout(new GridLayout(1,2,5,5));
p.add(l1);
p.add(l2);
c.add(p, BorderLayout.SOUTH);
setSize(300,300);
setVisible(true);
}
public static void main (String[] args){
new PanelEx();
}
}