수학과의 좌충우돌 프로그래밍

[Java] GUI 기초, 자주 사용하는 컴포넌트들을 정리해보자 본문

프로그래밍 언어/Java

[Java] GUI 기초, 자주 사용하는 컴포넌트들을 정리해보자

ssung.k 2019. 5. 15. 21:54

 

AWT와 Swing

자바에서 사용할 수 있는 GUI 로는 AWT와 Swing 이 있습니다. 먼저 이 둘을 비교해보도록 하겠습니다.

AWT Swing
초기에 지원했던 GUI 상대적으로 늦게 나온 GUI
운영체제가 사용하는 자원을 사용 컴포넌트가 자바로 되어있음
플랫폼 의존적 플랫폼 독자적
컴포넌트 용량이 큼 컴포넌트 용량이 가벼움
컴포넌트 개수가 적음 컴포넌트 개수가 많음

이렇게만 비교해봐도 Swing이 더 좋아보이기 때문에 Swing에 대해서 알아보도록 하겠습니다. AWT가 먼저 출시되었고 Swing이 늦게 나왔기 때문에 두 클래스 이름은 충돌이 일어납니다. 따라서 Swing은 기존의 클래스 이름 앞에 J를 추가하여 나타냅니다. 버튼을 예로 들면 AWT에서는 Button으로, Swing에서는 JButton으로 말이죠.

자주 쓰이는 패키지

대부분의 경우에 다음과 같은 패키지만 있으면 모든 걸 구현할 수 있습니다.

  • java.awt

    Color 나 Point 같은 유틸리티 타입의 클래스들을 포함

  • java.awt.event

    GUI 컴포넌트로부터 발생되는 이벤트를 처리하기 위한 클래스와 인터페이스로 구성

  • javax.swing

    버튼이나 텍스트필드, 프레임, 패널과 같은 GUI 컴포넌트로 구성

 

컴포넌트와 컨테이너

자바에서 제공하는 컴포넌트는 컴포넌트컨테이너, 두 개로 나눌 수 있습니다. 컨테이너라고 함은 컴포넌트를 내부에 넣을 수 있는 컴포넌트를 의미한다.

컨테이너는 다시 최상위 컨테이너와 일반 컨테이너로 분류할 수 있습니다. 최상위 컨테이너랑 다른 컨테이너 안에 포함될 수 없는 컨테이너를, 일반 컨테이너는 반대로 다른 컨테이너 포함될 수 있는 컨테이너를 의미합니다.

 

GUI 만들기

간단한 예시를 통해 기본적인 요소들에 대해서 알아봅시다.

import javax.swing.*;
public class MyFrame extends JFrame{
  public MyFrame(){
    setSize(300,200);
		setTitle("MyFrame");
    setVisible(true);
  }
  
	public static void main(String[] args) {
		MyFrame f = new MyFrame();
  }
}

먼저 사용자가 정의하는 class 에 JFrame 을 상속하여 필요한 변수와 메소드를 추가해줍니다. 그 후 크기, 윈도우의 이름을 세팅하고 이를 화면에 띄워줍니다.

main에서는 MyFrame 객체를 생성하면 됩니다. 이 경우 윈도우를 담당하는 스레드가 하나 생성되어 main 이 종료되더라도 윈도우는 닫히지 않습니다.

추가적으로 JFrame 클래스에 존재하는 메소드들을 더 알아보겠습니다.

  • add(component) : 프레임에 컴포넌트 추가
  • setLocation(x,y) : 프레임의 위치지정
  • setSize(width, height) : 프레임에 크기지정
  • setIconImage(IconImage) : 타이틀 바, 태스크 스위처에 표시할 아이콘 정의
  • setTitle(string) : 타이틀 바에 제목을 변경
  • setResize(boolean) : 사용자가 크기 조절할지 여부 결정

 

배치관리자

컨테이너 안에 컴포넌트를 여러 개 배치하다보면 레이아웃을 잘 잡아야 합니다. 지금부터 이 방법을 알아보도록 하겠습니다.

  • BorderLayout

    import java.awt.BorderLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class Blog extends JFrame{
    	JPanel jp = new JPanel(); // 패널 초기화
    	JButton jb1 = new JButton("North"); // 버튼 초기화
    	JButton jb2 = new JButton("West"); // 버튼 초기화
    	JButton jb3 = new JButton("Center"); // 버튼 초기화
    	JButton jb4 = new JButton("East"); // 버튼 초기화
    	JButton jb5 = new JButton("South"); // 버튼 초기화
    	
    	public Blog(){
    		jp.setLayout(new BorderLayout()); // BorderLayout
    		
    		jp.add(jb1, "North"); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb2, "West"); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb3, "Center"); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb4, "East"); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb5, "South"); // jp라는 패널에 jb라는 버튼 추가
    		
    		add(jp); // JFrame에 jp라는 패널 추가
    		
    		setSize(400, 300); // 윈도우의 크기 가로x세로
    		setVisible(true); // 창을 보여줄떄 true, 숨길때 false
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // x 버튼을 눌렀을때 종료
    	}
    
    	public static void main(String[] args){
    		Blog b = new Blog();
    	}
    }
    

     

  • FlowLayout

    패널의 디폴트 배치 관리자로서 하나의 줄에 차례로 배치되며, 공간을 초과하면 줄바꿈을 시행합니다.

    import java.awt.FlowLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class Blog extends JFrame{
    	JPanel jp = new JPanel(); // 패널 초기화
    	JButton jb1 = new JButton("1"); // 버튼 초기화
    	JButton jb2 = new JButton("2"); // 버튼 초기화
    	JButton jb3 = new JButton("3"); // 버튼 초기화
    	JButton jb4 = new JButton("4"); // 버튼 초기화
    	JButton jb5 = new JButton("5"); // 버튼 초기화
    	
    	public Blog(){
    		jp.setLayout(new FlowLayout()); // BorderLayout
    		
    		jp.add(jb1); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb2); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb3); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb4); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb5); // jp라는 패널에 jb라는 버튼 추가
    		
    		add(jp); // JFrame에 jp라는 패널 추가
    		
    		setSize(400, 300); // 윈도우의 크기 가로x세로
    		setVisible(true); // 창을 보여줄떄 true, 숨길때 false
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // x 버튼을 눌렀을때 종료
    	}
    
    	public static void main(String[] args){
    		Blog b = new Blog();
    	}
    }
    

     

  • GridLayout

    격자로 배치를 하며 모든 컴포넌트의 크기는 같도록 비율을 나눠 가져갑니다.

    import java.awt.GridLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class Blog extends JFrame{
    	JPanel jp = new JPanel(); // 패널 초기화
    	JButton jb1 = new JButton("1"); // 버튼 초기화
    	JButton jb2 = new JButton("2"); // 버튼 초기화
    	JButton jb3 = new JButton("3"); // 버튼 초기화
    	JButton jb4 = new JButton("4"); // 버튼 초기화
    	JButton jb5 = new JButton("5"); // 버튼 초기화
    	
    	public Blog(){
    		jp.setLayout(new GridLayout(0,3,10,10)); // BorderLayout
    		
    		jp.add(jb1); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb2); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb3); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb4); // jp라는 패널에 jb라는 버튼 추가
    		jp.add(jb5); // jp라는 패널에 jb라는 버튼 추가
    		
    		add(jp); // JFrame에 jp라는 패널 추가
    		
    		setSize(400, 300); // 윈도우의 크기 가로x세로
    		setVisible(true); // 창을 보여줄떄 true, 숨길때 false
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // x 버튼을 눌렀을때 종료
    	}
    
    	public static void main(String[] args){
    		Blog b = new Blog();
    	}
    }
    

    이 때 격자를 어떻게 나눌지 설정이 가능합니다.

    		jp.setLayout(new GridLayout(0,3,10,10));
    

    행:0 열:3 에 해당되며 0 값을 가지면 동적으로 변하게 됩니다. 또한 뒤에 인자를 통해서 각 컴포넌트 간의 간격을 조절할 수 있습니다.

 

  • 절대위치

    setLayout(null);
    

    배치관리자를 지정하지 않는다는 의미로 절대 위치로 컴포넌트들을 나타냅니다. 위에서 다루었던 setSizesetLocation 을 사용합니다.

 

기초 컴포넌트

여러 컴포넌트들이 있지만 가장 많이 쓰이는 3가지, 레이블, 텍스트 필드, 버튼에 대해 알아보겠습니다.

  • 레이블

    레이블은 수정이 불가능한 텍스트를 삽입할 때 사용합니다. 텍스트를 삽입하는 방식으로는 2가지가 있습니다.

    // 1번째
    JLabel label = new JLabel("삽입할 텍스트 문구");
    // 2번째
    JLabel label = new JLabel();
    label.setText("삽입할 텍스트 문구");
    
  • 텍스트 필드

    텍스트 필드는 사용자가 한 줄의 텍스트를 입력할 수 있는 공간을 만듭니다. 텍스트도 어떤 텍스트를 입력할지에 따라 다양한 종류의 텍스트 필드가 존재합니다.

    • JTextField : 기본적인 텍스트 필드
    • JFormattedTextField : 사용자가 입력할 수 있는 문자를 제한
    • JPasswordField : 사용자가 입력하는 내용이 보이지 않음
    • JComboBox : 사용자가 직접 입력할 수 도 있으며, 항목 중에서 선택도 가능
    • JSpinner : 텍스트 필드와 버튼의 조합으로 이전,다음 버튼으로 선택가능

    텍스트필드 사용 시 알아야할 사항이 몇 가지 있습니다.

    • 선언 시 칸 수를 함께 선언해주어야 합니다.

      JTextField textfield = new JTextField(20);
      
    • 편집을 불가능하게 설정할 수 있습니다.

      setEditable(false);
      
    • 접근자와 설정자로 값을 대입 및 반환 할 수 있습니다.

      textfield.getText();
      textfield.setText();
      

       

  • 버튼

    버튼은 말 그대로 우리가 생각하는 버튼입니다. 버튼에도 여러 종류가 있습니다.

    • JButton : 일반적인 버튼
    • JRadioButton : 라디오 버튼으로 하나만 체크 가능
    • JMenuItem : 메뉴
    • JCheckBoxMenuItem : 체크박스를 가지고 있는 메뉴 항목
    • JRadioButtonMenuItem : 라디오 버튼을 가지고 있는 메뉴 항목
    • JToggleButton : 2가지 상태를 가지고 토글이 가능한 버튼

'프로그래밍 언어 > Java' 카테고리의 다른 글

[JAVA] 02. 변수  (0) 2020.11.27
[JAVA] 01. 자바를 시작하기 전에  (2) 2020.11.27
[java]클래스를 알아보자 2  (0) 2019.04.10
[java]클래스에 대해 알아보자  (0) 2019.03.28
[java] 배열에 대해서 알아보자  (0) 2019.03.27
Comments