본문 바로가기
프로그래밍/자바

자바 Swing으로 GUI 만들기

by 밍구몬 2019. 3. 11.

자바의 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, 0011);
        gbinsert(jb2, 1011);
        gbinsert(lblReceive, 0111);
        
        
        
        //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(170200));
        bjp.setPreferredSize(new Dimension(170200));
        gbjp.setPreferredSize(new Dimension(170200));
        njp.setPreferredSize(new Dimension(170200));
        
        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(10105050);
        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