-
[Java 개념] 자바 그래픽 GUI AWT 설명 및 예제Java/Java 개념 2022. 9. 1. 22:43
- GUI 프로그래밍이란?
- AWT란?
- Container란?
- Component란?
- LayoutManager란?
- 이벤트(Event)란?
- 구현
- GUI 프로그래밍이란?
GUI는 과거에 사용하던 DOS(CUI방식)와 같은 방식의 텍스트 기반 운영체제가 아닌 그래픽을 이용하여
사용자와 프로그램 간의 상호작용을 할 수 있도록 해주는 인터페이스를 의미한다.
자바에서는 이러한 그래픽 프로그래밍을 지원하기 위해 나온 것이 AWT이다.
- AWT란?
AWT(Abstract Window Toolkit)는 GUI 프로그래밍을 제작하기 위해 자바에서 제공하는 라이브러리
AWT는 모든 GUI 프로그램에 사용되는 컴포넌트 및 툴킷을 제공, 향후 JFC와 같은 스윙(Swing)의 모태가 된다.
AWT는 운영체제에 구애받지 않고 쓸 수 있도록 공통적이고 기본적인 컴포넌트들을 추상화하여 제공한다.
실행되는 운영체제에 따라 다르게 보이거나 동작 방식에 차이가 있을 수 있다.
이러한 단점을 극복하기 위해 개발된 것이 JFC(Java Foundation Classes) 이다.
- Container란?
자신의 영역에 컴포넌트를 포함시키고 관리하는 역할, 컨테이너가 다른 컨테이너를 포함할 수도 있다.
컴포넌트 또한 컨테이너에 붙이지 않으면 화면에 출력되지 않는다.
=> 무조건 컨테이너에 붙여야 화면에 출력이 된다!!
컨테이너의 종류에는 Frame, Window, Panel, Applet, Dialog, FileDialog, ScrollPane이 있다.
컨테이너에 컴포넌트를 붙이기 위해 add() 메서드를 사용한다.
- Component란?
실제로 컨테이너에 붙어 화면을 구성하는 요소이다.
모든 컴포넌트들의 super 클래스로서 GUI 프로그램을 구성하는 구성단위이다.
각 컴포넌트들에서 공통으로 사용되어지는 메서드들을 가지고 있다.
컴포넌트의 종류에는 Button, Canvas, Checkbox, Choice, Label, List, Scrollbar가 있다.
- LayoutManager란?
컨테이너는 자기 자신에 컴포넌트를 붙일 때 어디에, 어떤 방식으로 배치하여 붙일것인가를 결정한다.
정해진 레이아웃에 따라 컴포넌트들을 자동으로 배치하는 기능을 컨테이너들은 가지고 있다.
이를 배치관리자(LayoutManager) 라고 한다.
배치관리자는 다른 방식으로 배치기능을 가지며, 컨테이너는 기본적으로 하나의 배치관리자를 가진다.
사용자가 임의로 배치관리자는 다시 설정 가능하며, 수동으로 좌표를 이용해 배치할 수 있다.
배치관리자의 종류에는 FlowLayout, BorderLayout, GridLayout, CardLayout이 있다.
- 이벤트(Event)란?
이벤트(Event)는 어떤 특정한 행동이 발생한 그 자체를 의미한다.
메뉴를 선택하거나, 마우스를 클릭하거나, 윈도우의 크기를 조정하는 행위가 그 중 하나이다.
이벤트 소스(Event Source)는 이벤트가 발생되는 컴포넌트이다.
ex ) Button, CheckBox, List, Frame, Mouse, etc..
이벤트 리스너(Event Listener)는 이벤트 소스에서 이벤트가 발생하는지를 검사하고 있다가
이벤트가 발생이 되면 실질적으로 이벤트 처리를 할 수 있도록 만든 인터페이스이다.
이벤트 핸들러(Event Handler)는 이벤트 리스너에 전달된 이벤트를 실제적으로 처리할 수 있도록 이벤트
리스너에 포함되어 있는 메서드로 발생된 이벤트 객체를 받아와서 실제적으로 처리해주는 기능을 가진다.
ActionEvent = 버튼이 눌리거나 List, Menu 등의 컴포넌트가 선택되었을 때 발생
ActionListener = ActionEvent를 처리하는 이벤트 리스너 (인터페이스)
=> 반환 형태 : void actionPerformed(ActionEvent e)
- 구현
(1) Button 예제
import java.awt.*; public class ButtonEx { public static void main(String[] args) { Frame f = new Frame("버튼 테스트"); Panel p = new Panel(); Button b1 = new Button(); Button b2 = new Button("버튼2"); Button b3 = new Button("버튼3"); Button b4 = new Button("버튼4"); b1.setLabel("버튼1"); // 버튼1 이름 설정 // 패널에 버튼 붙이기 p.add(b1); p.add(b2); p.add(b3); p.add(b4); // 프레임에 패널 붙이기 f.add(p); f.setLocation(300, 300); // 프레임 위치 지정 f.setSize(300,100); // 프레임 크기 지정 f.setVisible(true); // 프레임 생성 } }
(2) TextField 예제
import java.awt.*; public class TextFieldEx { public static void main(String[] args) { Frame f = new Frame("텍스트필드 테스트"); // 프레임 생성 Panel p = new Panel(); // 패널 생성 TextField tf1 = new TextField("아이디 입력", 12); // 텍스트 필드 생성 TextField tf2 = new TextField("비밀번호 입력", 10); // 텍스트 컴포넌트 내의 모든 텍스트를 선택 tf1.selectAll(); tf2.selectAll(); tf2.setEchoChar('*'); // 비밀번호를 *로 뜨게 하기 p.add(tf1); // 패널에 텍스트 필드 넣기 p.add(tf2); f.add(p); // 프레임에 패널 붙이기 f.setSize(300,100); // 프레임 사이즈 설정 f.setVisible(true); // 프레임 생성 } }
(3) GridLayout 예제
import java.awt.*; public class GridLayoutEx { public static void main(String[] args) { Frame f = new Frame("GridLayout 테스트"); f.setLayout(new GridLayout(2,3)); Button b1 = new Button("1.1"); Button b2 = new Button("1.2"); Button b3 = new Button("1.3"); Button b4 = new Button("1.4"); Button b5 = new Button("2.1"); Button b6 = new Button("2.2"); Button b7 = new Button("2.3"); Button b8 = new Button("2.4"); f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5); f.add(b6); f.add(b7); f.add(b8); f.setLocation(300, 300); f.setSize(200, 200); f.setVisible(true); } }
(4) CardLayout 예제
아래의 코드는 3초가 지나면 3개의 패널이 바뀌며 보여진다.
import java.awt.*; public class CardLayoutEx extends Frame { CardLayout card; Panel first_panel, second_panel, third_panel; public CardLayoutEx() { super("CardLayout 테스트"); card = new CardLayout(); setLayout(card); first_panel = new Panel(); first_panel.add(new Button("1")); first_panel.add(new Button("2")); second_panel = new Panel(); second_panel.add(new Button("3")); second_panel.add(new Button("4")); third_panel = new Panel(); third_panel.add(new Button("5")); third_panel.add(new Button("6")); add("1", first_panel); add("2", second_panel); add("3", third_panel); } public void rotate() { for(int i=0; i<2; i++) { try { Thread.sleep(3000); } catch(Exception e) { e.printStackTrace(); } card.next(this); } } public static void main(String[] args) { CardLayoutEx clt = new CardLayoutEx(); // 위치, 너비, 높이 지정 clt.setBounds(200, 200, 200, 100); clt.setVisible(true); clt.rotate(); } }
(5) ActionEvent 예제
AWT는 [X] 버튼을 누르면 종료가 되지 않는다.
종료를 시키기 위해서는 오버라이딩을 통해 구현해야 한다.
사실상 종료하는데에 있어서는 windowClosing(WindowEvent e)만 구현하면 되기 때문에 나머지는 비워두었다.
import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import java.awt.Panel; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; public class ActionEventEx extends Frame implements ActionListener, WindowListener { Panel p; Button input, exit; TextArea ta; public ActionEventEx() { super("ActionEnvet Test"); p = new Panel(); input = new Button("Input"); exit = new Button("Quit"); ta = new TextArea(); input.addActionListener(this); // 리스너 연결 exit.addActionListener(this); // 리스너 연결 addWindowListener(this); p.add(input); p.add(exit); add(p, BorderLayout.NORTH); add(ta, BorderLayout.CENTER); setBounds(300,300,300,200); setVisible(true); } // JVM이 이벤트 핸들러를 실행한다. @Override public void actionPerformed(ActionEvent ae) { String name; name = ae.getActionCommand(); if(name.equals("Input")) { ta.append("버튼이 입력되었습니다.\n"); } else { ta.append("프로그램을 종료합니다. \n"); // 예외 처리 try { Thread.sleep(2000); } catch(Exception e) { } System.exit(0); } } public static void main(String[] args) { new ActionEventEx(); } @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub System.exit(0); } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub } }
(6) ActionEvent + Adapter 예제
Adapter 클래스는 이벤트 리스너 인터페이스 중 추상메서드가 2개 이상 존재하는 인터페이스를 구현한 추상 클래스.
불필요한 메서드를 구현하는 것을 없애준다.
멤버 이너 클래스(Member inner class), 익명 이너 클래스(Anonymous inner class)를 사용해 보았다.
import java.awt.Button; import java.awt.Frame; import java.awt.Panel; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class AdapterEx extends Frame implements ActionListener { Panel p1, p2, p3; TextField tf; TextArea ta; Button b1, b2; public AdapterEx() { super("Adapter Test"); p1 = new Panel(); p2 = new Panel(); p3 = new Panel(); tf = new TextField(35); ta = new TextArea(10, 35); b1 = new Button("Clear"); b2 = new Button("Exit"); p1.add(tf); p2.add(ta); p3.add(b1); p3.add(b2); add("North", p1); add("Center", p2); add("South", p3); setBounds(300, 200, 300, 300); setVisible(true); b1.addActionListener(this); b2.addActionListener(this); // tf.addKeyListener(new KeyEventHandler(tf, ta)); tf.addKeyListener(new KeyEventHandler()); // Anonymous inner class addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } // Member inner class class KeyEventHandler extends KeyAdapter { public void keyTyped(KeyEvent e) { if (e.getKeyChar() == KeyEvent.VK_ENTER) { ta.append(tf.getText() + "\n"); tf.setText(""); } } } @Override public void actionPerformed(ActionEvent e) { String str = e.getActionCommand(); if (str.equals("Clear")) { ta.setText(""); tf.setText(""); tf.requestFocus(); } else if (str.equals("Exit")) { System.exit(0); } } public static void main(String[] args) { new AdapterEx(); } } //// 멤버 이너 클래스로 //class KeyEventHandler extends KeyAdapter { // TextField tf; // TextArea ta; // // public KeyEventHandler(TextField tf, TextArea ta) { // this.tf = tf; // this.ta = ta; // } // // public void keyTyped(KeyEvent e) { // if (e.getKeyChar() == KeyEvent.VK_ENTER) { // ta.append(tf.getText() + "\n"); // tf.setText(""); // } // } //} //// 익명 이너 클래스로 //class WindowEventHandler extends WindowAdapter() { // public void windowClosing(WindowEvent e) { // System.exit(0); // } //}
이미지 출처 : https://www.tutorialspoint.com/awt/images/awt-mini-logo.jpg
'Java > Java 개념' 카테고리의 다른 글
[Java] 제어문(선택 제어문 / 반복 제어문), 제어 키워드 (0) 2022.07.15 [Java] this와 this()의 차이점 (0) 2022.07.10 [Java] 클래스 외부, 내부 구성 요소 (2) 2022.07.09 [Java] 중첩 for문으로 별찍기 (1) 2022.07.06 [Java] 논리 연산자(&&, ||)와 비트 연산자(&, |)의 차이 (2) 2022.07.05