목차
자바 GUI 기초
9.1 자바 GUI 소개
- 콘솔-기반 : 명령 프로프트와 같이 텍스트만을 사용하여 사용자와 대화하는 것 (현재는 거의 사용되지 않음)
- 그래픽 사용자 인터페이스 (Graphical User Interface)
- GUI 기반의 응용 프로그램을 작성하다 보면, 클래스·객체·상속·인터페이스들이 실제로 어떻게 사용되는지 체험 가능
- GUI는 객체들로 만들어 지고 이 객체들은 GUI 컴포넌트라고 한다.
- 대표적인 컴포넌트가 버튼, 체크박스, 콤보박스
AWT, 스윙, JavaFX
: 현재 자바에서 사용할 수 있는 GUI
- AWT(Abstract Windows Toolkit) : 운영체제가 제공하는 자원을 이용하여 컴포넌트를 생성
- 스윙(Swing) : 순사 자바로 작성되어 있어서 어떤 플랫폼이든 일관된 화면을 보여줄 수 있다.
자바 AWT | 자바 스윙 |
플랫폼 의존적 | 플랫폼 독립적 |
무거움(중량) | 가벼움(경량) |
룩앤필을 지원하지 않음 | 룩앤필을 지원 |
컴포넌트의 개수가 적음 | 비교적 많은 컴포넌트를 제공 |
MVC (모델 뷰 컨트롤러) 모델을 따르지 않음 | MVC 모델을 따름 |
- JavaFX : HTML5와 안드로이드 때문에 모바일에서도 많이 사용하지 않음. (오라클에서도 지원 중단)
- 스윙은 AWT에서 업그레이드 된것이라 클래스 이름에 J를 붙임
- 스윙 컴포넌트는 계층 구조로 설계되어 일부 컴포넌트는 다른 컴포넌트들을 포함한다
스윙 패키지
- 모두 18개의 패키지로 구성되어 있지만, 대부분의 프로그램은 일부만 사용
- java.awt : GUI 컴포넌트를 위한 부모 클래스들을 제공, Color나 Point와 같은 유틸리티 타입의 클래스 포함
- java.awt.event : GUI 컴포넌트로부터 발생되는 이벤트를 처리하기 위한 클래스와 인터페이스를 포함
- javax.swing : 버튼이나 텍스트 필드, 프레임, 패널과 같은 GUI 컴포넌트들을 포함
9.2 자바 GUI 기초
컨테이너 컴포넌트
- 단순 컴포넌트 : 단순한 컴포넌트
JButton, JLabel, JCheckbox, JChoice, JList, JMenu, JTextField, JScrollbar, JTextbar, JTextArea, JCanvas 등이 속함 - 컨테이너 컴포넌트 : 다른 컴포넌튿을을 내부에 넣을 수 있는 컴포넌트
JFrame, JDialog, JPanel, JScrollPane 등이 여기에 속함
최상위 컨테이너
: 절대 다른 컨테이너 안에 포함될 수 없는 컨테이너
- JFrame, JDialog, JApplet 등
GUI 프로그램을 만드는 절차
- 제일 먼저 최상위 컨테이너를 하나 생성해야 한다
- 그 다음 애플리케이션에 필요한 컴포넌트를 생성하여 컨테이너에 추가
프레임을 생성하는 방법 # 1
- JFrame의 객체를 생성
main()이 종료되어도 윈도우는 종료되지 않음
자바 스윙에서 JFrame 객체를 만들면 윈도우를 담당하는 새로운 스레드가 하나 생성되기 때문
프레임을 생성하는 방법 # 2
- JFrame을 상속한 클래스를 정의 ( 그 객체 자체가 컨테이너가 될 수 있음)
- 필요한 변수나 메소드를 추가할 수 있음
프레임에 버튼 추가하기
- add() 메소드를 이용
- setVisible(true)는 맨 마지막
더 자세한 내용은 카테고리 스윙 프로젝트에 있음
9.3 컨테이너 살펴보기
JFrame 클래스
- 프레임(Frame), 메뉴바(Menubar), 컨텐트 페인(Content Pane)으로 되어 있다.
- 프레임(Frame)은 AWT에서 제공하는 클래스로서 윈도우 자체를 나타낸다.
- 메뉴바(Menubar)는 메뉴를 부착할 수 있는 공간이다.
- 컨텐트 페인(Content Pane)은 컴포넌트들을 부착하는 판유리 같은 것이다.
- 프레임이 제공 하는 메소드 중 많이 사용되는 것들
- add(component) : 프레임의 컨텐트 페인에 컴포넌트를 추가
- setLocation(x,y), setSize(width,height) : 프레임의 위치와 크기를 설정
- setIconImage(IconImage) : 윈도우의 제목줄에 표시할 아이콘을 설정
- setTitle() : 제목줄의 제목을 변경
- setResizable(boolean) : 사용자가 윈도우의 크기를 조절하도록 허용하는지 여부 설정
- getContentPane() : 프레임 안의 컨텐트 페인을 가져온다.
- setLayout() : 프레임의 배치 관리자를 설정한다.
JPanel 클래스
- 컴포넌트들을 부착할 수 있도록 설계된 컨테이너 중의 하나
- 일반적으로 패널에 컴포넌트를 추가하고 그 패널을 프레임에 추가한다.
- setQpaque() : 투명도를 조절한다.
- setLayout() : 배치 관리자 설정
- add(aComponent) : 패널에 컴포넌트를 추가
- remove(aComponent) : 패널에서 컴포넌트를 제거
- setBackground(Color c) : 패널의 배경색을 변경
9.4 배치 관리자
: 컨테이너 안에 존재하는 컴포넌트들의 크기와 위치를 관맇나느 객체
(컨테이너 마다 하나씩만 존재)
배치 관리자의 종류
- FlowLayout : 컨테이너에 추가되는 순서대로 컴포넌트를 부착 (왼 → 오, 위 → 아래)
- BorderLayout : 컨테이너의 영역을 동서남북, 중앙 5개 영역으로 구분하여 배치 (기본 배치 관리자)
- GridLayout : 컨테이너의 공간을 동일한 크기의 격자로 나누고 이 격자에 배치
- CardLayout : 컨테이너에 컴포넌트를 카드처럼 겹치게 쌓아서 배치
배치 관리자를 설정하기
- 컨테이너에 배치 관리자를 설정하려면 먼저 new 연산자를 이용하여 배치 관리자 객체를 만들고 이 객체를 컨테이너의 setLayout() 메소드를 사용하여 배치 관리자로 지정한다.
panel.setLayout(new BorderLayout()); // 패널의 배치 관리자를 설정
FlowLayout
- 각 컴포넌트들은 하나의 줄에서 차례로 배치되고 더 이상 공간이 없으면 다음 줄에 배치된다.
- 생성자
- FlowLayout()
- FlowLayout(int align) : 정렬 방법을 지정
- FlowLayout(int align, int hGap, int vGap) : 간격을 지정
BorderLayout
- 컨테이너를 5개의 영역(상, 하, 좌, 우, 중앙)으로 구분하고 각각의 영역에 컴포넌트를 배치할 수 있는 배치 관리자.
- 컴포넌트를 add 할때 지정해주어야 한다. ("North", "South", "East", "West", "Center")
add(button, "South");
- 지정해주지 않으면 기본값은 "Center"
- 여러 개의 컴포넌트를 같은 영역에 추가하는 경우, 마지막으로 추가된 컴포넌트만 표시
- 생성자
- BorderLayout()
- BorderLayout(int hGap, int vGap)
GridLayout
- 컨테이너 공간을 격자 모양으로 나눈 후에 각 셀에 하나씩 컴포넌트들을 배치한다.
- 생성자
- GridLayout() : 1행 1열
- GridLayout(int rows, int cols) : rows 행 cols 열
- GridLayout(int rows, int cols, int hGap, int vGap) : 간격 지정
- 행의 개수나 열의 개수를 0으로 하면 추가하는 컴포넌트의 개수에 따라서 행이나 열의 개수가 정해진다.
CardLayout
- 한 번에 하나의 컴포넌트만 볼 수 있게 배치하는 관리자
- 일반적으로 사용하는 메소드
- next(container) : 주어진 컨테이너의 다음 카드로 이동
- previous(container) : 주어진 컨테이너의 이전 카드로 이동
- first(contanier) : 주어진 컨테이너의 첫 번째 카드로 이동
- last(contanier) : 주어진 컨테이너의 마지막 카드로 이동
절대 위치로 배치하기
- 컨테이너 안의 컴포넌트들의 크기와 위치가 외부의 영향을 받지 않는 경우 사용
- 특수한 효과를 주고자 하는 경우에 사용
- setLayout(null), 컴포넌트는 위치와 크기를 지정해주어야 한다.
http://docs.oracle.com/javase/tutorial/uiswing/layout/
9.5 기초 컴포넌트들
레이블
- 사용자를 위한 정보 또는 계산의 결과를 표시하는 데 사용
- 텍스트와 이미지를 동시에 표시할 수 있다.
- 텍스트를 표시하는 데 사용하는 폰트의 종류, 크기, 색상 등은 변경 가능
레이블에 이미지 표시하기
- 스윙 컴포넌트에 이미지를 표시하려면 먼저 ImageIcon 인스턴스를 생성하여야 한다.
- setIcon() 메소드를 사용하여 레이블에 이미지를 지정한다.
- 레이블에 이미지가 설정되면 레이블의 텍스트는 오른쪽에 표시된다.
텍스트 필드
- JTextField 클래스로서 제공
- 입력이 가능한 한 줄의 텍스트 상자
- JPasswordField : 사용자가 입력하는 문자를 보여주지 않는다.
- JFormattedTextField : 사용자가 입력할 수 있는 문자 집합을 제한
- requestFocus() : 키보드 포커스
- 텍스트 필드에 입력후 enter키 입력시 이벤트 발생
버튼
- 사용자가 클릭했을 경우, 이벤트를 발생하여 원하는 동작을 하게 하는데 이용
- 버튼 안의 텍스트, 폰트, 버튼의 전경색, 배경색, 버튼의 상태 변경 가능
- JButton : 가장 일반적인 버튼
- JCheckBox : 체크박스 버튼
- JRadioButton : 라디오 버튼
- JToggleButton : 2가지 상태를 가지고 토글이 가능한 버튼
Summary
- GUI(Graphic User Interface)는 그래픽을 이용하여 사용자 인터페이스를 구성하는 기술이다.
- 자바에서 GUI를 위한 패키지에는 AWT, 스윙(SWING) 등이 있다. 스윙은 경량 컴포넌트들로 구성된 GUI로서 운영체제가 다르더라도 동일한 모양을 지원한다.
- AWT는 java.awt 패키지로 제공되고 스윙은 javax.swing 패키지로 제공된다.
- 컨테이너는 안에 컴포넌트들을 저장할 수 있는 특수한 컴포넌트이다.
- JFrame은 최상위 컨테이너로서 윈도우 기능을 제공한다. 내부에 있는 컨텐트 페인을 이용하여서 컴포넌트들을 부착할 수 있다.
- 컨테이너는 하나의 배치 관리자를 가질 수 있다. 배치 관리자는 컴포넌트들의 위치와 크기를 제어한다.
- FlowLayout은 컨테이너에 추가되는 순서대로 컴포넌트를 부착한다. 위쪽에서 아래쪽으로, 왼쪽에서 오른쪽으로 배치한다. 패널의 기본 배치 관리자이다.
- GridLayout은 컨테이너의 공간을 동일한 크기의 격자로 나누고 이 격자에 컴포넌트를 배치한다.
- 스윙 컴포넌트에 이미지를 표시하려면 먼저 ImageIcon 인스턴스를 생성하여야 한다. 이후에 setIcon() 메소드를 사용하여 컴포넌트에 이미지를 지정한다.
- 텍스트 필드 중에서 JPasswordField를 사용하면 사용자가 입력하는 텍스트가 보이지 않는다.
'Java > 교재 정리' 카테고리의 다른 글
*14 함수형 프로그래밍, 람다식, 스트림 (0) | 2024.07.09 |
---|---|
13 제네릭과 컬렉션 (1) | 2024.06.10 |
*16 멀티 스레딩 (1) | 2024.05.02 |
08 자바 API 패키지, 예외 처리, 모듈 (0) | 2024.04.27 |
07 추상 클래스, 인터페이스, 중첩 클래스 (1) | 2024.04.26 |