#####. AWT
###. Abstract Windows Toolkit
#. AWT는 자바에서 윈도우 프로그래밍을 할 때 사용되는 다양한 클래스를 포함하고 있는 패키지
#. Controll Class는 AWT 컴포넌트의 일종으로 사용자 인터페이스를 구성하는 가장 기본이 되는 것
###. GUI
#. 키보드 뿐만 아니라 마우스와 각종 그래픽 요소를 통해 사용자와 응용 프로그램이 서로 소통하는 것
#. 명령창을 실행하고 키보드로 dir를 입력하는 대신 windows의 파일 탐색기에서 마우스로 특정 폴더를 더블클릭 함으로써 그 폴더의 내용을 화면으로 확인 할 수 있는 것이 CLI 환경과 다른 GUI환경
#. 이때 GUI를 위해 사용 되는 각종 그래픽 요소를 GUI 컴포넌트라고 한다.
$. Component란 Container안에서 사용되며 다른 곳에서도 API를 사용해 불러들여져 사용 가능한 독립적인 모듈이라고 생각 하면 될듯 하다.
$. 교재에도 push버튼, radio버튼, 탭, 체크방스 등이 다양한 GUI 컴포넌트라 얘기한다.
###. Frame
#. Frame Class를 상속 받아 사용할 수 있다.
import java.awt.*;
class MyFrame extends Frame {
public MyFrame(String tiltle){
super(title);
this.setSize(400,300);
this.setVisible(true);
}
}
public class HelloAWT{
main ------
MyFrme myFrame = new MyFrame("ZZZ AWT");
}
- 위의 소스코드로 정의한 창을 띄울 수 있다.
- 위에도 정의 되어있듯이 setSize(),와 SetVisible()을 정의해줘야 창을 띄울 수 있다.
###. GUI 컴포넌트 클래스
#. 윈도우 프로그램에서 사용자와 프로그램 간의 의사소통 수단으로 사용되는 각종 도구를 GUI컴포넌트 라고 한다.
#. 메뉴, 툴바, 버튼, 스크롤바 등이 GUI 컴포넌트에 해당한다.
#. GUI컴포넌트는 개별 프로그램에서 필요에 따라 만들어 사용하는 것이 아니라 미리 만들어진 것을 개별 프로그램이 가져다 사용하는 것이다.
#. AWT 패키지에도 다양한 GUI 컴포넌트를 제공한다.
#. AWT가 제공하는 GUI 컴포넌트는 클래스 형태로 제공
#. 메뉴 관련 컴포넌트를 제외한 대부분의 컴포넌트는 java.awt.Component 클래래스의 서브 클래스로 정의
#. 자바의 GUI 컴포넌트는 기능에 따라 두가지로 분류된다.
- contol : 사용자와 실제 의사소통에 사용되는 GUI 컴포넌트를 의미
: 버튼이나 스크롤바 등이 여기 해당
: Button, Canvasn CheckBox, Choicem Lavel, List, Menu, Scrollbar 등이 있다.
- container : 사용자와의 의사소통에는 직접적으로 관여하지 않고 하나 이상의 컨트롤을 포함하여 그 컨트롤의 배치 등을 조절하는 역할을 하는 GUI 컴포넌트를 의미
: Frame, Windows, Dialog, Panel, ScrollPane Class 같은 것이 있다.
#. 컨테이너의 경우에는 그 안에 다른 컴포넌트를 포함할 수 있기 때문에 레이아웃 이란 속성도 별도로 갖는다.
#. 컨테이너 컴포넌트 중에서 Frame이나 Window 클래스는 최상위 컨테이너로 사용
#. Frame은 테두리(border)와 제목 표시줄 (titlebar)을 갖고 있는 윈도우를 의미
#. Window는 테두리와 제목 표시줄이 없는 윈도우를 의미
#. Frame이나 Window 안에는 바로 컨트롤이 오거나 다른 컨테이너가 위치할 수 있으며 컨테이너 안에느 ㄴ다른 컨테이너가 중첩되어 위치할 수 있다.
###. Window 와 Frame Class
#. Object - Component - Container - Window - Frame
#. Window와 Frame 클래스는 컨테이너에 속하는 클래스로 새로운 창을 표시할 때 사용되는 최상위 계층의 컨테이너
#. Window 클래스
- 최상위 계층 컨테이너로 테두리와 메뉴바를 갖지 않는다.
- Window 클래스 객체의 기본 레이아웃은 BorderLayout 클래스를 사용
- Window 클래스의 객체를 생성시키기 위해 소유자(owner)를 지정해야 하고 테두리나 메뉴바가 없기 떄문에 메인 차보다는 부수적인 정보를 보여주는 창으로 활용
- Window 객체의 소유자로는 Frame이나 다른 Window를 지정해야 한다.
- 사용법
: Frame fOwner = new Frame("Owner");
Window wWinodw = New Window("fOwner");
- 생성자 : Window(Frame owner), Window(Window owner) : Frame 이나 Window를 소유자(owner)로 하는 객체를 생성
#. 주요 메서드
- Window getOwner () : 현재 Window 객체를 소유자로 리턴
- Window [] getOwnedWindows () : 현재 Window 객체가 소유하고 있는 윈도우를 리턴
- void pack() : 포함된 컴포넌트들의 크기에 맞게 윈도우 크기를 맞춤
- void dispose() : 현재 Window 객체의 하위 컴포넌트나 하위 윈도우가 사용하는 모든 시스템 자원을 반환
#. Frame 클래스
- Frame 클래스는 Window와 마찬가지로 최상위 계층 컨테이너로 테두리와 메뉴바를 가질 수 있으며, 레이아웃으로 BorderLayout을 사용
- 객체를 생성할 때 소유자 없이 독립적으로 생성 할수 있기 때문에 일반적으로 최상위 창으로 많이 사용된다.
- 생성자
: Frame(), Frame(String title) : 제목이 없거나 제목이 지정된 Frame 윈도우를 생성
- 주요 메서드
: static Frame [] getFrames () : 현재 프로그램에 의해 생성된 모든 Frame 윈도우들을 리턴
: void setMenuBar(MenuBar mb) : 메뉴바를 설정하거나 설정된 메뉴바를 리턴
###. 메뉴의 사용
#. AWT에서 제공되는 메뉴는 크게 풀다운 메뉴(pull-down menu)와 팝업 메뉴 (pop-up menu)로 분류
#. 풀다운 메뉴는 윈도우의 제목 표시줄 바로 밑에 붙는 메뉴바 형식
#. 팝업 메뉴는 윈도우 내부 영역 어디서든지 나타날 수 있는 메뉴를 말함.
#. pop-up menu
- 팝업 메는 Frame에 고정적으로 보이는 Menubar와 달리 어디서든 마우스 우클릭으로 나타나는 옵션이다.
- 아래 소스코드를 참고하여 나타낼 수 있다.
/*PopMenuExam.java*/
import java.awt.Frame;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class PopMenuExam extends Frame {
PopupMenu pm = new PopupMenu();
MenuItem pm_item1 = new MenuItem("전체선택");
MenuItem pm_item2 = new MenuItem("복사하기");
MenuItem pm_item3 = new MenuItem("잘라내기");
MenuItem pm_item4 = new MenuItem("붙혀넣기");
public PopMenuExam() { // 기본생성자
super("팝업메뉴 샘플");
// 팝업메뉴에 메뉴아이템 추가
pm.add(pm_item1);
pm.addSeparator(); // 구분선
pm.add(pm_item2);
pm.add(pm_item3);
pm.add(pm_item4);
add(pm); // 팝업메뉴를 프레임에 추가
setSize(300, 400);
setVisible(true);
//x 종료버튼
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//팝업메뉴 보여주기 이벤트
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent me) {
// 오른쪽 마우스 버튼을 누르면 PopupMenu를 화면에 보여준다.
if (me.getButton() == MouseEvent.BUTTON3)
pm.show(PopMenuExam.this, me.getX(), me.getY());
}
});
}
public static void main(String[] args) {
new PopMenuExam();
}
}
###. FileDialog
#. FileDialog는 파일을 저장하거나 불러오기를 할떄 사용할 수 있는 대화상자
#. 기본 기능은 각 폴더에서 원하는 파일을 선택할 수 있도록 해준다.
#. FileDialog는 무조건 modal 대화 상자로 생성
#. modal 대화 상자는 대화상자에서 작업을 마치고 대화상자를 종료할 때까지 다른 윈도우에서는 작업을 할 수 없는 대화상자
#. modaless 대화상자는 대화상자가 종료되지 않은 상태에서 다른 윈도에서 작업을 할 수 잇는 대화상자
#. FileDialog 실행 화면
###. 배치관리자의 사용
#. 배치관리자는 프레임과 같은 컨테이너의 내부에 또 다른 컨테이너나 컨트롤등과 같은 자식 컴포넌트를 배치하는 역할
#. 배치관리자를 사용하는 경우 자식 컴포넌트의 위치를 구체적으로 정하는 것이 아니라 배치 방식 지정하는데, 부모 컴포넌트의 크기가 바뀌면 자식 컴포넌트의 크기와 위치가 자동적으로 재조정 된다.
#. 배치관리를 위한 클래스로는 자식 컴포넌트들을 수평으로 배열하는 Flowlay클래스
#. 격자 형식 배열 GridLayout 클래스
#. 동서남북/중앙의 영역에 배치하는 BoarderLayout 클래스
#. 각 컴포넌트를 카드fh 취급하여 반번에 하나의 카드만 보이도록 배치하는 CardLayout클래스등이 있다.
#. 모든 컨테이너 컴포넌트에는 기본 배치관리자가 지정되어 있어서 자식 컴포넌트가 자동으로 배치
#. 컨테이너와 기본 배치 관리자의 관계
- 컨테이너 : Frame, Window, Dialog -> 기본배치 관리자 : BorderLayout
- 컨테이너 : Panel -> 기본배치 관리자 : Flowlayout
#. BorderLayout Class
- 기본 배치관리자로 사용
- 그 영역
#. FlowLayout Class
- 마치 문서 작성기에 글을 쓰듯이 자식 컴포넌트를 순서대로 일렬로 배치하는 역할
- 그 역역
- FlowLayout.CENTER, LEFT, RIGHT, LEADING, TRAILING
#. GridLayout Class
- 자식 컴포넌트를 배치할 영역의 격자 또는 바둑판 형식으로 분할한 후 각 격자에 하나씩 차례로 배치
#. CardLayout Class
- 컨테이너에 포함된 컴포넌트를 각각 하나의 카드로 간주하고 한 번에 하나의 카드만 화면에 나타나도록 한다.
###. AWT Controll Class
#. 컨트롤은 GUI를 구성하는 가장 기본이 되는 컴포넌트
#. AWT에서 제공되는 컨트롤은 대부분 운영체제가 제공하는 GUI 컴포넌트와 1:1로 대응되는데 이때 AWT 컨트롤과 1:1로 대응되는 운영체제의 GUI 컴포넌트를 피어(peer)라고 한다. 따라서 AWT의 기본적인 동작은 피어에 위임
#. Button Class
- 제목이 달린 버튼을 위한 클래스
#. Canvas Class
- 사각형의 공간을 나타내는 클래스
-Window와는 달리 독립적인 컴포넌트가 아니라 다른 컨테이너에 포함되어 존재하는 클래스로 보통 그래픽 용도로 사용
- 그림을 그려서 보여주거나 문자를 출력하거나 또는 사용자 정의 컨트롤을 만들 때 사용
마우스로 그림을 그리는 소스코드를 참조해보자
// Java Program to create a
// canvas and mouse listener to the
// canvas ( a circle of radius 5 will appear
// at the points where mouse are clicked or
// dragged on the canvas)
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class canvas extends JFrame implements MouseListener, MouseMotionListener {
// create a canvas
Canvas c;
// constructor
canvas()
{
super("canvas");
// create a empty canvas
c = new Canvas() {
public void paint(Graphics g)
{
}
};
// set background
c.setBackground(Color.black);
// add mouse listener
c.addMouseListener(this);
c.addMouseMotionListener(this);
add(c);
setSize(400, 300);
show();
}
// mouse listener and mouse motion listener methods
public void mouseClicked(MouseEvent e)
{
Graphics g = c.getGraphics();
g.setColor(Color.red);
// get X and y position
int x, y;
x = e.getX();
y = e.getY();
// draw a Oval at the point
// where mouse is moved
g.fillOval(x, y, 5, 5);
}
public void mouseMoved(MouseEvent e)
{
}
public void mouseDragged(MouseEvent e)
{
Graphics g = c.getGraphics();
g.setColor(Color.red);
// get X and y position
int x, y;
x = e.getX();
y = e.getY();
// draw a Oval at the point where mouse is moved
g.fillOval(x, y, 5, 5);
}
public void mouseExited(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mousePressed(MouseEvent e)
{
}
// main class
public static void main(String args[])
{
canvas c = new canvas();
}
}
|
###. AWT 이벤트 처리하기
#. AWT 컴포넌트에 대해 사용자가 마우스 버튼 클릭드으이 행동ㄷ을 하면 이벤트가 발생한다. 어떤 AWT 컴포넌트에 이벤트가 발생했을 때 정해진 동작을 하도록 정의된 클래스를 이벤트 처리기라고 한다.
#. AWT 컴포넌트 클래스는 사용자의 입력으 ㄹ받아 프로그램에 전달하는 UI(User Interface)의 역할을 한다.
#. AWT 컴포넌트가 GUI컴포넌트로 동작하려면 사용자의 입력을 받아 어떤 동작을 할 수 있어야 하는데 지금까지 프로그램은 그렇지 못하다.
#. AWT 컴포넌트가 사용자의 입력에 대해 반응하려고 동작하려면 사용자로부터 어떤 입력이 발생했는지 시스템이나 프로그램 또는 해당 컴포넌트가 감지할 수 있어야 한다. 사용자의 입력은 정해진 시간에 정해진 방식으로만 발생하느 것이 아니기 때문에 사용자의 입력에 따른 컴포넌트의 동작도 정해진 시간에 정해진 방식으로 수행될 수 없다.
#. 이렇나 사용자의 입력에 대해 반응하고 특정 컴포넌트가 그 입력에 대해 동작하기 위해 자바언어는 이벤트라는 개념을 사용한다.
#. 이벤트는 일반적으로 사용자가 UI 컴포넌트에 대해 취하는 모든 종류의 행위로부터 발생하는 일종의 사건이다. 예를들어 사용자가 마우스를 이용하여 특정 버튼을 클릭하는 행위를 하게 되면 버튼에 대해 누군가 버튼을 클릭했다 라는 이벤트가 발생하는 것이다.
#. 특정 컴포넌트에서 이벤트가 발생하면 다시 말해 특정 컴포넌트에 대해 사용자가 어떤 동작을 취하면 컴포넌트는 그것에 반응하여 행동을 취해야 한다. 예를 들어 마우스로 버튼을 클릭했으면 버튼이 눌린 모습으로 그 겉모양을 바꾸거나 하는 것이다.
#. 어떤 이벤트가 발생했을 떄 그에 대한 정해진 어떤 코드를 실행하는 것을 이벤트 처리(even handling)이라고 하고 그런 기능을 담당하는 메서드를 이벤트 처리기 (event handler)라고 한다.
###. 이벤트 처리 방식
#. 이벤트는 특정 컴포넌트를 대상으로 발생하기 때문에 이벤트는 이벤트 대상이되는 컴포넌트가 처리한다.
#. 자바2 플랫폼 이후부터는 컴포넌트를 상속하는 클래스가 이벤트를 처리하지 않고, 다른 객체에 이벤트의 처리를 위임하는 이른바 위임형 모델 (Event Delegation Model)로 이벤트를 처리한다.
#. 이떄 이벤트 처리를 위임받은 대상을 이벤트리스너(event listener)라고 한다.
#. 위임형 이벤트 처리모델에서는 특정 이벤트를 처리학 위한 객체를 따로 등록하고 그 객체에게 이벤트 처리를 위임한다.
#. 이때 이벤트를 발생시킨 컴포넌트를 이벤트 소스(event source)라고 하고, ㅇ벤트 처리를 맡은 객체를 이벤트 리스너라고한다.
#. 예를들어 버튼 컴포넌트에서 마우스로 버튼을 클릭하면 마우스 이벤트가 발생하는데 버튼 컴포넌트 자신이 이벤트 소스가 되고 마우스 클릭에 해당하는 이벤트 처리를 위임받은 새로운 객체가 바로 이벤트 리스너가 된다.
#. 하나의 이벤트 소스에서 서로 다른 여러 이벤트가 발생할 수 있다.
#. 하나의 이벤트 소스와 연결된 이벤트 리스너는 여러가지가 존재할 수 있다.
#. 예를들어 버튼 컴포넌트에서는 마우스 이벤트 뿐만 아니라 명령 수행을 의미하는 액션 이벤트도 발생할 수 있다.
#. 또한 여러 개의 서로 다른 이벤트 소스에서 같은 종류의 이벤트가 발생할 수 있다. 예를 들어 여러 개의 서로 다른 버튼에 에서 같은 이벤트인 마우스 이벤트가 각각 발생할 수 있다.
#. 자바에서는 모든 AWT 컴포넌트가 이벤트 소스 역할을 하는데 이 AWT 컴포넌트 클래스들은 이벤트 리스너를 등록해 주는 메서드를 제공한다.
#. 예를들어 모든 컴포넌트의 조상 컴포넌트인 ComponentClass 에서는 addMouselistner ()메서드가 존재하는데 마우스와 관련된 이벤트 리스너를 등록하이 윈한 메서드이다.
###. 이벤트 클래스와 이벤트 리스너
#. 이벤트 리스너에서는 구체적인 개별 이벤트를 처리하기 위한 메서드가 세부적인 개별 이벤트로별로 하나씩 정의되어 있다.
#. 예를들어 마우스와 관련된 이벤트인 MouseEvent를 처리하는 MouseListener 인터페이스에는 MouseEvent 중에서도 마우스의 버튼이 눌렸을 떄 발생하는 개별 이벤트를 처리하는 메서드 mousePressed()가 정의 되어 잇고, 해당 컴포넌트의 영역 안으로 마우스가 들어왔을 때 발생하는 세부 이벤트를 처리하는 메서드로 mouseEnterd()가 정의되어 있다.
#. AWT컴포넌트마다 발생할 수 있는 이벤트의 종류가 다르며 아래 페이지에 자세히 나와있다. 가서 공부하자
https://www.oreilly.com/library/view/java-awt-reference/9781565922402/29_appendix-c.html
#. 자바 이벤트 처리방식
https://www.javatpoint.com/delegation-event-model-in-java
'IT_Term' 카테고리의 다른 글
[IT_Term] k8s의 pod가 뭐야!!? (0) | 2023.06.18 |
---|---|
[IT_Term] java_JDBC프로그래밍_방통대 교재 정리 (0) | 2023.06.10 |
[IT_Term] java Thread programming_방통대 교재 정리 (0) | 2023.06.10 |
[IT_Term] java_collection,hasSetMap,arryList_방통대 교재 정리 (0) | 2023.06.10 |
[IT_Term] java.nio(new input output).pakage_방통대 교재 정리 (0) | 2023.06.10 |