본문 바로가기

JAVA 공책/수업 메모

GUI - Java.awt 패키지의 component & 이벤트 처리

  • Java.awt 패키지의 component
    • TextField : 한 줄의 텍스트를 입력받는 클래스
      • 1)생성자
        • TextField()
        • TextField(int columns) - columns:열
        • TextField(String text)
        • TextField(String text, int columns)
      • 주요 메소드
        • void setEchoChar(char c) : 화면에 보여지는 글자를 설정
        • string getText() :입력된 문자열 가져오기
        • void setText(String str) : str로 텍스트 필드 내용 채우기





  • TextArea : 여러 줄 입력을 받을 수 있는 component
    • 1) Constructor
      • TextArea() : 행 수와 열 수를 지정하지 않은 텍스트 영역
      • TextArea(int rows, int columns) : 행 수와 열 수를 지정
      • TextArea(String text) : 텍스트를 설정
      • TextArea(String text, int rows, int columns) : 텍스트와 행 수 및 열 수를 지정
      • TextArea(String text, int rows, int columns, int scrollbars) : 텍스트와 행 수 및 열 수를 지정하고 스크롤 바 표시 여부를 설정. 스크롤 바는 정수이지만 TextArea의 상수(Field Summary)로 설정해야 합니다.

  • 2) 주요 메소드
    • void append(String str)
    • String setText()
    • void setText(String str)




  • ScrollBar : 범위 내의 값을 입력받기 위한 Component


  • ScrollPane : 출력 영역 보다 더 큰 컴포넌트를 출력하기 위한 Container
    • 출력 영역 보다 더 큰 컴포넌트를 Panel 이나 Frame에 바로 배치하면 출력 영역 이외의 영역은 잘려서, 잘려진 영역이 출력됩니다. 이런 경우에는 Scroll 에 컴포넌트를 배치 한 후, 출력해야 스크롤 바가 만들어져서 나머지 영역도 볼 수 있습니다.




  • Canvas : 별도의 출력 영역을 만드는 것으로, 이미지나 그림을 그리고자 할 때 사용

  • Menu : 
    • MenuBar, Menu, MenuItem, CheckboxMenuItem으로 구분
    • MenuBar는 Frame에 배치하고
    • Menu를 MenuBar나 Menu에 배치하고 MenuItem은 Menu에 배치
    • PopupMenu는 마우스 오른쪽 버튼을 눌렀을 때 보여지는 메뉴.




  • FileDialog
    • 파일 열기와 저장을 위한 대화상자
    • 자주 사용하기 때문에 API에서 제공합니다.




  • 배치 관리자 - Layout
  • container에 component 들을 어떤 식으로 배치할 것인지를 설정하는 것.
    frame이나 panel의 setLayout 메소드를 이용해서 설정
    panel의 경우는 생성자에 Layout 인스턴스를 대입해서 생성할 수 도 있습니다.
    • FlowLayout
      • panel의 기본 레이아웃으로 수평으로 순서대로 배치하고 옆으로 더 이상 배치할 수 없으면 아래에 배치하는 방식. (화면 크기를 마우스로 변경하게 되면 배치한 컨포넌트의 위치가 변경되므로 setResizable(false);로 화면 크기를 못 바꾸게 해서 문제 해결)
    • BorderLayout
      • Frame의 기본 레이아웃으로 5개의 영역으로 나누어서 배치
      • 각 영역에는 하나의 component만 배치가 가능
      • 하나의 영역에 여러 개를 배치하고자 하면 panel을 만들어서 여러 개를 배치 한 후 다시 배치하면 됩니다.
      • 각 영역의 이름은 Center, North, South, West, East 입니다. (대소문자 구분)
      • 영역에 컴포넌트를 배치할 때 add("영역이름", 컴포넌트)의 형태이며 영역이름을 생략하면 Center에 배치됩니다.
      • 컴포넌트가 배치되지 않은 영역은 Center에 포함됩니다.







  • GridLayout
    • 표 처럼 격자를 만들어서 컴포넌트를 배치하는 레이아웃
    • 모든 셀의 크기는 동일하고 하나의 셀에는 하나의 컴포넌트만 배치할 수 있습니다.
    • add를 호출하면 순서대로 배치가 됩니다.
    • add개수 보다 셀이 부족하면 행과 열의 수를 알아서 조정합니다.
    • 생성자에 행과 열의 수를 대입할 수 있고 셀의 가로와 세로 여백을 설정할 수 있습니다.
  • Null
    • 레이아웃을 설정하지 않는 것으로 컴포넌트의 크기와 위치를 개발자가 직접 설정해야 하는 레이아웃
    • 권장하지는 않지만 컴포넌트를 움직이거나 크기 조절을 하고자 하는 경우에 사용합니다. (커포넌트의 크기와 좌표 설정이 마음대로 가능하기 때문에 출력하는 것을 움직이게 할 수 있습니다)

java.awt의 이벤트 처리
  • swing, android가 동일한 방식으로 처리
  • event : 사용자 또는 프로그램에 의해 발생하는 사건
  • Listener : 이벤트를 처리해 줄 수 있는 인스턴스
  • EventHandler : 이벤트가 발생했을 때 호출되는 함수 또는 인스턴스
  • awt는 이벤트가 발생하면 jvm에게 이벤트가 전달되고 jvm은 이 이벤트 객체를 가지고 등록된 리스너를 찾아서 이벤트 핸들러를 호출합니다.
  • 이벤트 리스너 등록
    • 컴포너트.add이벤트리스너(이벤트 리스너 인스턴스);
  • 1.ActionListener 인터페이스
    • 버튼을 클릭하거나 메뉴 또는 리스트를 선택하거나 텍스트 필드에서 Enter를 눌렀을 때 발생하는 이벤트를 처리하기 위한 인터페이스.
  • 2.Evnet Routing
    • 여러 컴포넌트의 이벤트를 하나의 리스너가 처리하도록 만드는 것.
    • 이것이 가능한 이유는 이벤트를 처리하는 메소드의 매개변수가 이벤트가 발생한 객체의 주소를 가지고 있기 때문입니다.
    • 이벤트 객체의 getSource()를 호출하면 이벤트가 발생한 객체의 주소를 알 수 있습니다.
    • ActionEvent의 경우 getActionCommand()를 호출하면 이벤트가 발생한 객체의 문자열을 리턴해줍니다.
    • 버튼의 경우는 버튼이 작성된 타이틀을 메뉴의 경우는 메뉴에 보여지는 문자열을 리턴합니다.


  • 3. ItemListener
    • CheckBox 나 Radio Button을 선택했을 때 그리고 ComboBox에서 항목을 선택했을 때 발생하는 이벤트를 처리하기 위한 리스너
    • ItemEvent 클래스의 인스턴스가 이벤트에 대한 정보를 가지고 있습니다.
    • 선택하면 보여지는 항목이 다르게.
    • 불필요한 선택지는 없앨 때 쓰임 
      • 체크박스를 선택 하면
        • 선택한 체크박스의 문자열과 상태를 텍스트 영역에 출력하고
      • 카테고리 콤보박스를 선택하면
        • 카테고리 내의 항목을 세부내용 콤보박스에 출력하고
      • 버튼을 누르면
        • 선택한 콤보박스의 항목을 텍스트 영역에 출력하기


1. 윈도우를 만들어서 출력하기
->윈도우 클래스 만들기:프레임으로부터 상속받는 클래스를 생성

package awt_event2;

import java.awt.Frame;

public class ItemListener extends Frame {

    public ItemListener() {
        setBounds(100, 100, 400, 400);
        setTitle("이벤트 핸들링");
        setVisible(true);
    }
}
->메인 메소드에서 앞에서 만든 클래스의 인스턴스를 생성
package awt_event2;

public class Main {

    public static void main(String[] args) {
    
        new ItemListener();

    }

}

2. 윈도우에 컴퍼너트들을 배치
->생성자 메소드의 setVisible 메소드 호출 전에 추가

        // 체크박스
        
        //패널 생성
        Panel pn = new Panel();

        //체크박스 생성
        Checkbox ckboolean = new Checkbox("boolean");
        Checkbox ckbyte = new Checkbox("byte");
        Checkbox ckshort = new Checkbox("short");
        Checkbox ckchar = new Checkbox("char");
        Checkbox ckint = new Checkbox("int");
        Checkbox cklong = new Checkbox("long");
        Checkbox ckfloat = new Checkbox("float");
        Checkbox ckdouble = new Checkbox("double");

        //패널에 체크박스 얹기
        pn.add(ckboolean);
        pn.add(ckbyte);
        pn.add(ckshort);
        pn.add(ckchar);
        pn.add(ckint);
        pn.add(cklong);
        pn.add(ckfloat);
        pn.add(ckdouble);
        
        // 패널 북쪽에 위치
        add("North", pn);

        
        // 중앙 부, TextArea 배치
        TextArea ta = new TextArea(10, 70);
        add("Center", ta);
        
        // 하단 부 콤보박스 2개 배치
        // 콤보박스에 배치할 데이터 만들기
        String [] category = {
                "Programing", "Database",
                "IDE", "Framework"
        };
        // 카테고리 개수가 4개이면 {}가 4개
        String [][] content = {
                {"Java", "JavaScript", "swift"},
                {"Oracle","MySQL","MongoDB"},
                {"Eclipse","Android Studio","XCode"},
                {"Spring","MyBatis","Hibernate"}
        };
        
        // 초이스
        Choice cbcategory = new Choice();
        for(String imsi : category) {
            cbcategory.add(imsi);
        }
        
        Choice cbcontent = new Choice();
        for(String imsi : content[0]) {
            cbcontent.add(imsi);
        }
        
        Button bt1 = new Button("선택");
        Button bt2 = new Button("종료");
        
        // 패널에 버튼 넣기
        
        // 패널에 초이스 넣기
        Panel southPanel = new Panel();
        southPanel.add(cbcategory);
        southPanel.add(cbcontent);
        southPanel.add(bt1);
        southPanel.add(bt2);
        add("South", southPanel);

3. 이벤트를 처리
->setVisible 호출 전에 추가

//체크 박스를 눌렀을 때 호출될 메소드
        ItemListener itemHandler1 =
            new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    //이벤트가 발생한 인스턴스를 원래의 자료형인
                    //Checkbox로 변환
                    //이벤트 처리 메소드에서
                    //e.getSource()는 이벤트가 발생한
                    //인스턴스의 주소를 리턴합니다.
                    Checkbox cb =
                        (Checkbox)(e.getSource());
                    //체크 박스에 입력된 텍스트 가져오기
                    String label = cb.getLabel();
                    //체크 박스 선택 여부 가져오기
                    boolean b = cb.getState();
                    ta.append(label + " " + b + "로 변경\n");
                }
        };
        
        //체크박스를 눌렀을 때 호출될 인스턴스 설정
        cnboolean.addItemListener(itemHandler1);
        cnbyte.addItemListener(itemHandler1);
        cnshort.addItemListener(itemHandler1);
        cnchar.addItemListener(itemHandler1);
        cnint.addItemListener(itemHandler1);
        cnlong.addItemListener(itemHandler1);
        cnfloat.addItemListener(itemHandler1);
        cndouble.addItemListener(itemHandler1);
        
        //카테고리 콤보 박스의 선택이 변경되었을 때
        //호출될 메소드를 가진 Listener
        //ItemListener가 처리
        ItemListener itemHandler2 =
            new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    //cbcategory의 선택된 행 번호 가져오기
                    int row = cbcategory.getSelectedIndex();
                    //cbcontent의 내용을 전부 삭제
                    cbcontent.removeAll();
                    //행번호에 해당하는 세부 내용을 cbcontent에 추가
                    for(String temp : content[row]) {
                        cbcontent.add(temp);
                    }
                    
                }
        };
        
        cbcategory.addItemListener(itemHandler2);
        
        ActionListener action1 =
            new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    int caNum = cbcategory.getSelectedIndex();
                    int coNum = cbcontent.getSelectedIndex();
                    String categoryText = category[caNum];
                    String contentText = content[caNum][coNum];
                    ta.setText(categoryText + ":" + contentText);
                }
        };
        
        btnSelect.addActionListener(action1);
        
        //종료 버튼을 누르면 프로그램을 종료
        //System.exit(0)
        ActionListener action2 =
                new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.exit(0);
                    }
        };
        btnExit.addActionListener(action2);


[카테고리 콤보박스의 선택이 변경되었을 때
호출될 메소드를 가진 리스너 : ItemListener]


[버튼을 눌러을 때를 처리해주는 리스너: ActionListener
1.ActionListener 인스턴스를 만들기
2.사용할 컴포넌트와 연결]

**GUI 이벤트 처리!
->이벤트를 처리하는 리스너를 찾아야 합니다.

**Java 설치
=>www.oracle.com에서 다운로드 받아서 설치
=>현재는 1.8버전을 가장 많이 사용






'JAVA 공책 > 수업 메모' 카테고리의 다른 글

Swing  (0) 2018.07.18
Java, swing, Android의 view의 이벤트 처리형식  (0) 2018.07.18
GUI 프로그램을 하는 방법  (0) 2018.07.16
Scanner  (0) 2018.07.12
날짜&시간  (0) 2018.07.12