[Java] Swing (1)
Swing
자바에서 GUI를 개발하기 위해서는 AWT, SwIng등이 있는데, 이번 프로젝트는 Swing을 이용하여 만들어 보도록 할 것이다. 둘이 사용할 때의 차이는 예로 버튼 Button을 만든다면 AWT는 Button, Swing은 JButton을 사용한다. 앞의 J로 이 프로그램이 어떤 GUI 라이브러리로 만들어졌는지 알 수 있다.
컨테이너
GUI의 각각의 요소를 컴포넌트라고 한다. 버튼이나 텍스트등의 GUI의 요소들을 말하는데, 이러한 컴포넌트들이 자리를 잡을 화면, 창이 필요할 것이다. 이러한 창은 컨테이너 라고 한다. 컨테이너 조차도 하나의 컴포넌트라고 할 수 있는데, 이러한 컨테이너는 JFrame을 상속하여 만들어준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package swing;
import javax.swing.*;
public class MyFrame{
public static void main(String[] args){
JFrame frame = new JFrame;
frame.setSize(300,400);
frame.setTitle("첫 번째 프레임");
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
JFrame을 상속한 MyFrame() 클래스를 만들어 주었다.
- setTitle()은 창의 제목을 설정한다.
- setSize()는 창의 크기를 설정한다.
- setVisible은 창을 보이게 설정할 것인지, 안보이게 할 것인지를 정한다.
- setResizeable은 창의 크기조절을 가능하게 할것인지를 정한다.
- setLocationReativeTo는 매개변수를 null값으로 넣으면 창을 화면 정 가운데에 띄운다.
이제 main을 만들어 MyFrame의 생성자를 불러오면,
위와 같이 컨테이너를 생성했음을 알 수 있다.
이 창을 x를 눌러 닫으면 창은 닫혔지만, 다시 프로그램을 실행시키려 하면 이미 프로그램이 실행중이라고 종료 후 실행하겠다는 창이 뜬다. 따라서 창만 닫히고 프로그램은 종료되지 않고 있는 것이다. 따라서 창을 닫으면 프로그램이 종료 되는 기능을 추가해주어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package swing;
import javax.swing.*;
public class MyFrame{
public static void main(String[] args){
JFrame frame = new JFrame;
frame.setSize(300,400);
frame.setTitle("첫 번째 프레임");
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.serDefaultCloseOperation();
}
MyFrame생성자 안에 setDefaultCloseOperation() 메서드를 추가해주었다. 매개변수로 JFram.EXIT_ON_CLOSE를 넣어주면 시스템의 exit 메소드를 사용해서 프로그램을 같이 종료해준다.
여기까지는 GUI를 적용한 프로그램을 만들 때 반드시 추가해주어야 하는 부분이라고 할 수 있다.
버튼
그럼 이제 만들어준 컨테이너에 버튼을 한번 추가해보자.
1
2
3
4
5
6
7
MyFrame(){
setTitle("첫번째 프레임");
setSize(300,400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
}
먼저 컨탠트팬을 만들어준다. 창 자체위에 버튼들이 올라올 수 있는 공간으로 보통 우리가 보는 창에서 위의 상태창을 제외한 공간을 말한다.
getContentPane(); 을 추가하여 만들어주었다.
다음은 JButton 클래스를 사용해서 버튼의 인스턴스를 만들어 준 뒤, 컨테이너 자료형으로 선언한 c의 add() 메소드를 사용해서 버튼을 추가해주자.
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
package swing;
import javax.swing.*;
import java.awt.*;
public class MyFrame extends JFrame {
MyFrame(){
setTitle("첫번째 프레임");
setSize(300,400);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JButton j = new JButton("확인");
JButton j2 = new JButton("취소");
c.add(j);
c.add(j2);
setVisible(true);
}
public static void main(String[] args){
new MyFrame();
}
}
-
setLayout : 컨테이너의 배치를 결정하는 배치관리자 메서드 이다. 매개변수로 배치관리자를 넣어 주면 되는데, 컨테이너마다 하나의 배치관리자가 존재하며, 컨테이너에 부착되는 컴포넌트의 위치와 크기를 결정해준다. 배치관리자의 대표유형은 4가지인데, 아래와 같다.
- FlowLayout - 컴포넌트가 삽입되는 순서대로 왼쪽에서 오른쪽으로 배치, 배치할 공간이 없으면 아래로 내려와서 반복한다.
- BorderLayout - 컨테이너의 공간을 동,서,남,북,중앙의 5개영역으로 나누어 응용 프로그램에서 지정한 영역에 컴포넌트를 배치한다.
- GridLayout - 컨테이너를 프로그램에서 설정한 동일한 크기의 2차원 격자로 나눈다. 컴포넌트는 삽입 순서대로 좌에서우, 위에서 아래로 배치된다.
- CardLayout - 컨테이너의 공간에 카드를 쌓아놓은 듯이 컴포넌트를 포개어 배치
우리는 FlowLayout을 사용하여 버튼을 추가했다.
JButton 자료형의 버튼 인스턴스를 만들어 준뒤, 매개변수로는 버튼에 사용하고 싶은 텍스트를 써준다. 그리고 해당 인스턴스에 있는 메서드인 add()를 사용하면 간단하게 버튼을 만들 수 있다.
또, JLabel을 자료형으로 만든 변수를 add를 통해 추가하면 그냥 텍스트가 출력이 된다.
또, 리스트를 통해서 버튼을 추가할 수도 있다.
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
package swing;
import javax.swing.*;
import java.awt.*;
public class MyFrameEx extends JFrame {
Container c;
JButton buttonList[] = new JButton[4];
String strList[] ={"확인", "취소", "뒤로가기","앞으로가기"};
MyFrameEx(){
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,400);
setTitle("나의 두 번째 창");
c = getContentPane();
c.setLayout(new FlowLayout());
for(int i=0;i<buttonList.length;i++){
buttonList[i] = new JButton(strList[i]);
c.add(buttonList[i]);
}
setVisible(true);
}
public static void main(String[] args){
new MyFrameEx();
}
}
버튼과 버튼에 들어갈 문자열을 각각 리스트로 선언하여 버튼을 일일히 선언하지않고 한번에 처리하였다.
패널
패널은 프레임을 세부적으로 나누어주는 컴포넌트로, 패널을 나누어 놓으면 패널마다의 각각의 컴포넌트를 추가해놓고 패널단위로 가리거나 패널 단위로 편집할 수 있게 되어 유지보수에 편리하다. 패널은 패널안에도 추가할 수 있다.
패널은 JPanel로 선언하여, 배경색을 지정하고 안에 버튼을 넣어보자.
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
package swing;
import javax.swing.*;
import java.awt.*;
class MyFrame2 extends JFrame {
Container c;
JPanel jPanel = new JPanel();
JButton btn = new JButton();
JButton buttonList[] = new JButton[4];
String strList[] = {"확인", "취소", "뒤로가기","앞으로 가기"};
MyFrame2(){
setTitle("나의 두번째 창");
setSize(300,400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setButton();
setVisible(true);
}
void setButton(){
c = getContentPane();
jPanel.setBackground(Color.magenta);
jPanel.setLayout(new FlowLayout());
for(int i = 0; i<4; i++){
buttonList[i] = new JButton(strList[i]);
jPanel.add(buttonList[i]);
}
c.add(jPanel);
}
}
public class MyFrame3 {
public static void main(String[] args){
new MyFrame2();
}
}
깔끔하게 패널의 부분은 setButton() 메서드로 따로 정리 해주었다.
- setBackground() : 패널의 배경색을 설정하도록 해준다.
- setLayout() : 마찬가지로 패널을 어떻게 프레임에 넣을지 정해준다.
이렇게 실행한 창의 결과는 다음과 같다.
댓글남기기