작업 순서
1. 컨테이너 객체 생성
- 컨테이너 객체 생성하기
① JFrame 상속을 이용한 방법
import javax.swing.JFrame;
public class Test extends JFrame{
public Test(){
super("테스트");
}
public static void main(String[] args){
new Test();
}
}
② 상속 받지 않고 객체 생성하기
import javax.swing.JFrame;
public class Test{
public static void main(String[] args){
JFrame mainFrame = new JFrame("테스트");
}
}
③ JFrame 상속 받은 클래스 작성하고, 실행용 클래스가 실행
import javax.swing.JFrame;
public class Test1 extends JFrame{
public Test1(){}
}
class Test2{
public static void main(String[] args) {
new Test1();
}
}
- 컨테이너 세부 속성 지정
메소드 |
설명 |
setLocation(int x, int y) |
프레임 위치 설정 |
setSize(int width, int height) |
프레임 사이즈 설정 |
setBounds(int x, int y, int width, int height) |
프레임 위치와 사이즈 설정 |
setTitle(String title) |
프레임 제목 설정 |
setIconImage(IconImage) |
프레임 아이콘 이미지 설정 |
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) |
프레임 닫기 버튼 활성화 |
setVisiable(true) |
프레임 보이기 |
setResizavble(true) |
프레임 사이즈 조정 활성화 |
2. 배치 방식을 컨테이너에 셋팅함(레이아웃 설정)
- 컨테이너 배치 방식 지정
① BorderLayout(기본)
모두 5개 영역으로 나누고, 각 영역에 하나의 컴포넌트를 넣을 수 있음
한 영역에 하나 이상의 컴포넌트를 넣고 싶으면 Panel을 사용
setBounds(x, y, width, height);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//JFrame의 기본 LayoutManager객체는 BorderLayout
//setLayout(new BorderLayout()); //따로 안만들어줘도 기본적으로 생성됨
JButton north = new JButton("북");
JButton south = new JButton("남");
JButton east = new JButton("동");
JButton west = new JButton("서");
JButton center = new JButton("가운데");
//프레임에 추가
add(north, BorderLayout.NORTH);
add(south, BorderLayout.SOUTH);
add(east, BorderLayout.EAST);
add(west, BorderLayout.WEST);
add(center, BorderLayout.CENTER); //기본값
② FlowLayout
컴포넌트를 워드프로세서와 같은 방식, 즉 왼쪽에서 오른쪽으로 배치
3가지 정렬 방식(왼쪽, 가운데, 오른쪽)이 가능함
private void init() {
JFrame f = new JFrame();
f.setBounds(200,200,500,500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//JPanel추가
JPanel panel = new JPanel();
panel.setBackground(Color.orange);
//JPanel의 기본 LayoutManager : FlowLayoutManager
panel.setLayout(new FlowLayout(FlowLayout.LEFT)); //기본값이기에 생략해도 같음
for(int i=0; i<20; i++) {
JButton btn = new JButton(String.valueOf(i+1)); //정수형을 받는 컴포넌트가 없음
panel.add(btn);
}
f.add(panel); //기본값 center
f.setVisible(true);
}
③ GridLayout
컴포넌트들을 가로, 세로의 일정 수만큼 배치하고자 할 때 주로 사용
행과 열을 지정하고, 각 컴포넌트는 동일한 사이즈를 가짐
public class GridLayoutTest extends JFrame{
public GridLayoutTest(int x, int y, int w, int h) {
setBounds(x, y, w, h);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(3,4,5,5)); //gap을 줌 (5,5)
for(int i=1; i<13; i++) {
JPanel panel = new JPanel();
JLabel label = new JLabel(String.valueOf(i));
panel.setBackground(Color.gray);
panel.add(label);
add(panel);
}
}
public static void main(String[] args) {
new GridLayoutTest(100,100,500,500).setVisible(true);
}
}
④ CardLayout
여러 컨테이너를 슬라이드처럼 바꿔가며 보여줄 수 있음
앨범이나 퀴즈 또는 설치 프로그램에 주로 사용됨
public class CardLayoutTest extends JFrame {
//Listener클래스에서 접근할 수 있도록 필드로 선언함
private CardLayout cardLayout;
public CardLayoutTest() { //패널 교체해서 보여줌
setBounds(200,200,200,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//CardLayout 설정
cardLayout = new CardLayout();
setLayout(cardLayout);
//패널 생성
JPanel card1 = new JPanel();
JPanel card2 = new JPanel();
JPanel card3 = new JPanel();
card1.setBackground(Color.orange);
card2.setBackground(Color.darkGray);
card3.setBackground(Color.green);
JLabel label1 = new JLabel("card1");
JLabel label2 = new JLabel("card2");
JLabel label3 = new JLabel("card3");
card1.add(label1); //라벨 추가
card2.add(label2);
card3.add(label3);
//각 패널에 이벤트 리스너 객체 바인딩 (번거로워도 다 연결해야 작동함)
MouseListener listener = new MyMouseListener();
card1.addMouseListener(listener);
card2.addMouseListener(listener);
card3.addMouseListener(listener);
add(card1); //현재 프레임에 추가
add(card2);
add(card3);
}
//interface가 수많은 메소드 구현을 강제화 하고 있어서 추상메소드를 다 구현하지 않아도 손쉽게 이용할 수 있도록 중간에 AdapterClass(추상메소드를 다 구현만 해놓은 클래스)를 사용하여 원하는 메소드만 구현 가능
public class MyMouseListener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
//부모 컨테이너 객체 가져오기
Object src = e.getSource(); //이벤트가 발생한 객체 panel1, panel2
Container parent = ((JPanel)src).getParent();
//좌클릭한 경우
if(e.getButton() == MouseEvent.BUTTON1) {
cardLayout.next(parent);
}
//우클릭한 경우
else if(e.getButton() == MouseEvent.BUTTON3) {
cardLayout.previous(parent);
}
}
}
public static void main(String[] args) {
new CardLayoutTest().setVisible(true);
}
}
⑤ GridbagLayout
컴포넌트의 위치와 크기를 자유롭게 만들 수 있음
사용하기 매우 복잡함
3. 컴포넌트 객체 생성
- 컴포넌트 종류
컴포넌트 종류 |
설명 |
AbstractButton |
버튼과 연관된 클래스들의 상위 추상 클래스 |
ButtonGroup |
버튼을 그룹화 하기 위한 클래스 |
ImageIcon |
이미지를 아이콘으로 캡슐화하여 제공하는 클래스 |
JApplet |
애플릿(applet)의 스윙버젼으로 Applet 클래스로부터 상속된 클래스 |
JButton |
스윙에서 사용하는 버튼 클래스 |
JCheckBox |
스윙에서 사용하는 체크박스 클래스 |
JCheckBoxMenuItem |
스윙의 메뉴에서 사용하는 체크박스 클래스 |
JComboBox |
풀다운 리스트를 보여줄 수 있는 콤보박스 클래스 |
JComponent |
모든 스윙 컴포넌트의 상위 클래스 |
JLabel |
스윙에서 사용하는 라벨 클래스 |
JMenu |
스윙의 메뉴에서 사용하는 메뉴 클래스 |
JMenuBar |
스윙의 메뉴바를 만들기 위한 클래스 |
JMenuItem |
스윙에서 사용하는 메뉴관련 클래스의 상위 클래스 |
JPanel |
스윙에서 사용하는 패널 클래스 |
JRadioButton |
스윙에서 사용하는 라디오버튼 클래스 |
JRadioButtonMenuItem |
스윙의 메뉴에서 사용하는 라디오버튼 클래스 |
JScrollPane |
스크롤 윈도우를 나타내는 클래스 |
JTabbedPane |
그룹을 홀더 형태로 제공하는 윈도우를 나타내는 클래스 |
JTable |
데이터를 행과 열로 나타내는 클래스 |
JTextComponent |
스윙에서 사용하는 텍스트 관련 클래스들의 상위 클래스 |
JTextField |
스윙에서 사용하는 텍스트 필드 클래스 |
JToggleButton |
JCheckBox 클래스와 JRadioButton 클래스의 상위 클래스 |
JTree |
트리 형태를 나타내는 클래스 |
4. 지정된 배치 방식에 따라 컨테이너에 컴포넌트 배치함
5. 컴포넌트에 마우스나 키보드 반응에 대한 이벤트 처리함
'프로그래밍 > JAVA' 카테고리의 다른 글
04.30(Properties, IO, 배열을 사용한 예제) (0) | 2020.04.30 |
---|---|
04.29(ArrayList 내림차순 정렬 예제) (0) | 2020.04.29 |
04.27(GUI) (0) | 2020.04.27 |
04.24(서버와 클라이언트 / TCP 소켓 프로그래밍 순서) (0) | 2020.04.24 |
04.23(스레드) (0) | 2020.04.23 |