자바의 GUI를 만드는데에는 AWT와 Swing이 있다.
Swing은 AWT보다 컴포넌트가 많고, AWT보다 가볍기 때문에 보통 Swing을 사용한다.
AWT
- 자바가 처음 나왔을 때 함께 배포된 패키지로 많은 GUI 컴포넌트를 가지고 있다.
- 컴포넌트들은 운영체제의 도움을 받아 출력을 하기때문에 운영체제의 리소스를 많이 소모하여 운영체제에 부담을 많이 준다.
- AWT 버튼은 실행되는 운영체제에 따라 서로 다른 모형으로 그려진다.
Swing
- AWT 기술을 기반으로 작성된 라이브러리이다.
- AWT와 달리 순수하게 자바언어로 작성되어 있다.
- 스윙 컴포넌트들은 경량 컴포넌트라고도 한다.
- 운영체제의 도움을 받지 않고 구현되기 때문에 운영체제와 관계없이 항상 동일하게 작동하며 동일한 모양으로 그려진다.
- 스윙은 모든 AWT 컴포넌트와 100% 호환되는 컴포넌트들로 재작성 되었다.
- 스윙 컴포넌트의 이름은 AWT컴포넌트와 구분하기 위하여 대문자 J로 시작한다.
Swing
컨테이너란 다른 컴포넌트를 포함할 수 있는 특별한 GUI 컴포넌트를 일컫는다.
컨테이너가 있어야 버튼을 만들던지 다른 컴포넌트를 넣을 수 있다.
- Swing 클래스 계층 구조
JFrame
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import javax.swing.JFrame;
public class test extends JFrame{
public test()
{
super("J프레임 테스트"); //프레임의 타이틀 지정
setSize(500,500); //컨테이너 크기 지정
setVisible(true); //창을 보이게함
}
public static void main(String[] args) {
test t = new test();
t.setDefaultCloseOperation(EXIT_ON_CLOSE); //종료 이벤트
}
}
|
cs |
Layout
-
FlowLayout
Panel의 기본 레이아웃이다. 왼쪽에서 오른쪽으로 배치되며, 오른쪽 공간이 없으면 아래로 배치 된다.
FlowLayout(FlowLayout.LEFT, 10,100); 왼쪽 정렬, 좌우간격 10, 상하간격 100
-
BorderLayout
동, 서, 남, 북, 센터 5개의 영역으로 나눈다.
BorderLayout(10,100); //좌우간격 30, 상하간격 100
-
GridLayout
n행 n열로 구역을 나누어 준다.
GridLayout(2,3); 2행 3열로 구역을 나눔
-
GridBagLayout
GridLayout과 비슷하지만 컴포넌트의 위치와 크기를 직접 설정하여 배치할 수 있다.
-
CardLayout
여러 Layout을 만들어 필요에 따라 화면을 바꾸어 나타낼 수 있다.
-
Null
레이아웃을 사용하지 않고 각 컴포넌트마다 수동으로 위치를 지정해 줄 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Label;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class test extends JFrame{
GridBagLayout gbl;
JPanel gbjp;
public test()
{
super("J프레임 테스트"); //프레임의 타이틀
setSize(600,600); //컨테이너 크기 지정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//기본 레이아웃을 FlowLayout으로 지정 좌우 간격 20px, 상하 간격 50px
setLayout(new FlowLayout(FlowLayout.LEFT,20,50));
//2행 2열의 그리드 패널 사용
JPanel gjp = new JPanel(new GridLayout(2,2));
gjp.add(new JLabel("여기는"));
gjp.add(new JButton("b1"));
gjp.add(new JLabel("그리드"));
gjp.add(new JButton("b2"));
//BorderLayout 사용
JPanel bjp = new JPanel(new BorderLayout());
bjp.add(new JButton("북"),BorderLayout.NORTH);
bjp.add(new JButton("서"),BorderLayout.WEST);
bjp.add(new JButton("동"),BorderLayout.EAST);
bjp.add(new JButton("남"),BorderLayout.SOUTH);
bjp.add(new JButton("센터"),BorderLayout.CENTER);
//GridBagLayout 사용
gbjp = new JPanel();
gbl = new GridBagLayout();
Label lblReceive = new Label("test",Label.RIGHT);
JButton jb = new JButton("a");
JButton jb2 = new JButton("b");
gbjp.setLayout(gbl);
gbinsert(jb, 0, 0, 1, 1);
gbinsert(jb2, 1, 0, 1, 1);
gbinsert(lblReceive, 0, 1, 1, 1);
//null 사용
JPanel njp = new JPanel(null);
//njp.setLayout(null);
for(int i=1;i<=5;i++) {
JButton jbutton = new JButton(i+"번째 버튼");
jbutton.setBounds(10, i*40,100,30);
njp.add(jbutton);
}
//패널별 백그라운드 색상 지정
gbjp.setBackground(Color.red);
gjp.setBackground(Color.white);
bjp.setBackground(Color.black);
njp.setBackground(Color.white);
//패널의 크기 지정
gjp.setPreferredSize(new Dimension(170, 200));
bjp.setPreferredSize(new Dimension(170, 200));
gbjp.setPreferredSize(new Dimension(170, 200));
njp.setPreferredSize(new Dimension(170, 200));
add(gjp);
add(bjp);
add(gbjp);
add(njp);
setVisible(true); //창을 보이게함
}
public void gbinsert(Component c, int x, int y, int w, int h){
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill= GridBagConstraints.BOTH;
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = w;
gbc.gridheight = h;
gbl.setConstraints(c,gbc);
gbjp.add(c);
}
public static void main(String[] args) {
test t = new test();
}
}
|
cs |
JButton
버튼의 위치를 조정하고 싶다면 레이아웃을 null로 해주어야 한다.
버튼의 위치조정은 setBounds로 하며, x축, y축, 높이, 넓이 순이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
public class test extends JFrame{
JButton b1;
private JButton b2, b3;
public test()
{
super("J프레임 테스트"); //프레임의 타이틀
setSize(500,500); //컨테이너 크기 지정
setDefaultCloseOperation(EXIT_ON_CLOSE);
//버튼을 넣기 위한 패널 생성
JPanel jp = new JPanel();
//패널 레이아웃 설정 레이아웃을 설정해야지 버튼의 위치 크기를 조절할 수 있다.(기본 레이아웃은 불가)
jp.setLayout(null);
//버튼 생성
JButton btn = new JButton("b1");
//이미지 버튼 생성
ImageIcon img = new ImageIcon ("D:\\img\\p.jpg");
JButton btn2 = new JButton(img);
//패널에 버튼 추가
jp.add(btn);
jp.add(btn2);
//버튼 위치 조정
btn.setBounds(10, 10, 50, 50);
btn2.setBounds(100,10,300,300);
//컨테이너에 패널 추가
add(jp);
setVisible(true); //창을 보이게함
}
public static void main(String[] args) {
test t = new test();
}
}
|
cs |
JLabel 과 JTextField
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class test extends JFrame{
public test()
{
super("J프레임 테스트"); //프레임의 타이틀
setSize(600,600); //컨테이너 크기 지정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//기본 레이아웃을 FlowLayout으로 지정 좌우 간격 20px, 상하 간격 50px
setLayout(new GridLayout(2,2));
JLabel jl = new JLabel("입력 : ");
JTextField jt = new JTextField();
JLabel jl2 = new JLabel("입력 : ");
JTextField jt2 = new JTextField();
add(jl);
add(jt);
add(jl2);
add(jt2);
setVisible(true); //창을 보이게함
}
public static void main(String[] args) {
test t = new test();
}
}
|
cs |
'프로그래밍 > 자바' 카테고리의 다른 글
JavaFX :: Scene Builder 설치 (0) | 2019.03.15 |
---|---|
자바 Swing 메뉴 만들기 (0) | 2019.03.14 |
자바 숫자야구 소스 (0) | 2019.03.07 |
자바 멀티 쓰레드(Thread) 동기화 예제 (0) | 2019.03.05 |
자바 쓰레드(Thread) (0) | 2019.03.01 |