Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

붓, 그리다

화면 배치, 이벤트 처리 본문

JAVA/Basic

화면 배치, 이벤트 처리

붓그린 2017. 6. 16. 17:12
[ 화면에 배치시키는 방법 ]
- 배치관리자를 이용

- 레이아웃 변경 메서드

대상자.setLayout(변경시킬 배치관리자명객체명)


1) BorderLayout
- Frame의 기본 레이아웃
- 컴포넌트를 left, right, top, bottom, center(5개의 위치)에 부착시키는 방법
- 부착시키는 위치를 지정하지 않으면 무조건 맨 마지막 컴포넌트만 화면전체에 배치
- East, West, North, South, Center로 위치 지정


package j0613;

import java.awt.*; // 1) 그래픽에 대한 클래스 가져오기

public class BorderTest extends Frame{ // 2) 상속을 받아서 화면 디자인
                //화면에 부착시킬 컴포넌트를 선언
                //Panel p; //장판
                Button b1,b2,b3,b4,b5;
        public BorderTest(String title) {
                super(title); //setTitle(title);
                setBounds(200,200,400,200);
                // 창에 부착시킬 컴포넌트 생성->
                // 부착 : 창객체명.add(부착시킬 컴포넌트명)
                b1=new Button("연습1");
                b2=new Button("연습2");
                b3=new Button("연습3");
                b4=new Button("연습4");
                b5=new Button("연습5");

                // 창객체명.add(부착시킬 컴포넌트명, 위치(BorderLayout.위치)
                this.add(b1,BorderLayout.NORTH);
                add(b2, BorderLayout.SOUTH);
                add(b3, "Center");
                add(b4, "East");
                add(b5, "West");

                setVisible(true);
        }

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                BorderTest bt=new BorderTest("배치관리자연습");
        }

}



2) FlowLayout
- 컴포넌트를 왼쪽을 기준으로 오른쪽으로 배치 (css flow:left와 비슷한듯?)
- 오른쪽에 배치공간이 부족하면 다음 줄에 개행 (overflow?)

// 2) FlowLayout
 FlowLayout fl=new FlowLayout();
this.setLayout(fl); // Layout를 변경
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);



3) GridLayout
- 바둑판식 방식으로 컴포넌트를 배치
- 테이블(표) 형식

GridLayout gl=new GridLayout(행,열,수평gap,수직gap)

GridLayout gl=new GridLayout(3,2,5,5);
this.setLayout(gl); // Layout를 변경

add(b1);
add(b2);
add(b3);
add(b4);
add(b5);

setVisible(true);



4) 순수좌표값으로 화면 배치
- setSize(w,h) or seBounds(x,y,w,h)



*축약구문
- 생성자 형태로 객체값을 입력할 수 있다.

this.setLayout(new GridLayout(3,2,4,4)); 





[ AWT or Swing 이벤트 처리 방법 ]

1. 이벤트(Event)
- 운영체제가 인식 가능한 사용자들의 모든 행동양식

1) 이벤트 소스 (Event Source)
- 이벤트를 발생시킨 대상 컴포넌트
ex) 버튼클릭 -> 버튼(대상자)

2) 이벤트 발생자 : 발생시킨 이벤트 종류
- ActionEvent : 버튼, 메뉴 클릭, 입력하고 엔터
- MouseEvent : 마우스클릭, 드래그
- WindowEvent : 창 종료, 최소화, 크기 조절 등~)
- KeyEvent : 키보드(자판기)의 특키를 눌렀을 때

3) 이벤트 핸들러(Event Handler)
- 발생시킨 이벤트 종류에 따라 내부적으로 호출해주는 메서드
- 형식

이벤트 종류명 뒤에 Listener of Adapter를 불인다.

EX) 버튼 클릭시

ActionEvent -> ActionListener of Adapter (인터페이스)




[ 이벤트 처리 프로그래밍 4가지 공식 ]

1. 이벤트가 발생이 되면 누가 처리하는가? 분류하는 기준?
- 발생 : 자신, 처리 : 자신 -> 보편적인 방법 : WindowListener(상속)


1) 이벤트 처리에 해당되는 클래스, 인터페이스를 import
- 이벤트 처리를 해줄 이벤트 소스 결정

import java.awt.event.*;


2) 인터페이스 WindowListener에서 상속받은 추상메서드
-> 이벤트 핸들러의 프로그래밍

// 인터페이스 WindowListener에서 상속받은 추상메서드
        @Override
        public void windowActivated(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowActivated"); // 창의 활성화
        }

        @Override
        public void windowClosed(WindowEvent e) {
                // TODO Auto-generated method stub
                // 창이 닫힌 후 발생
        }

        @Override
        public void windowClosing(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowClosing"); // 종료버튼을 눌렀을 때
                System.exit(0); // 종료
        }

        @Override
        public void windowDeactivated(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowDeactivated"); // 창의 비활성화
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowDeiconified"); // 창의 비아이콘화(복원)
        }

        @Override
        public void windowIconified(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowIconified"); // 창의 아이콘화(최소화)
        }

        @Override
        public void windowOpened(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowOpened"); // 창이 열렸을 때
        }




*메서드 호출
1) 수동 호출 : 객체명.일반메서드(~)

2) 자동 호출 : 시스템에서 호출하는 경우
- 객체명.일반메서드(~) 호출하지 않음
-> 코딩하는 문장을 연결만 시킨다.
=> 콜백메서드


3) 콜백메서드 연결하기 ( 이벤트 소스와 이벤트 핸들러 연결)

이벤트소스(대상자).addXXXListener(처리해줄객체명)





2. 다른 클래스가 대신 이벤트를 처리해주는 경우

1) 이벤트를 처리해주는 클래스 생성(인터페이스 상속)
2) 이벤트 핸들러 프로그래밍
3) 생성자에 객체생성

package j0613;
// 다른 클래스가 대신 이벤트를 처리해주는 경우

import java.awt.*; // awt폴더 안에 있는 파일만 적용, awt내의 다른 폴더는 대상이 아님

// 1) 이벤트 처리에 해당되는 클레스, 인터페이스를 import
import java.awt.event.*;

public class WindowTest2 extends Frame{

        public WindowTest2(String s) {
                super(s);
                setBounds(300,300,400,200);
                // 이벤트 연결구문) 이벤트소스(대상자).addXXXListener(처리해줄객체명)
                Other ot=new Other();
                this.addWindowListener(ot)
                setVisible(true);
        }

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                new WindowTest2("다른 클래스 Other가 대신 처리");
        }

}

// 이벤트를 대신 처리해주는 클래스를 따로 작성
class Other implements WindowListener{

        @Override
        public void windowActivated(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowActivated"); // 창의 활성화
        }

        @Override
        public void windowClosed(WindowEvent e) {
                // TODO Auto-generated method stub
                // 창이 닫힌 후 발생
        }

        @Override
        public void windowClosing(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowClosing"); // 종료버튼을 눌렀을 때
                System.exit(0); // 종료
        }

        @Override
        public void windowDeactivated(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowDeactivated"); // 창의 비활성화
        }

        @Override
        public void windowDeiconified(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowDeiconified"); // 창의 비아이콘화(복원)
        }

        @Override
        public void windowIconified(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowIconified"); // 창의 아이콘화(최소화)
        }

        @Override
        public void windowOpened(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowOpened"); // 창이 열렸을 때
        }
}


3. 내부클래스(inner class)를 이용하는 방법 p403
- 클래스 내부에 또 다른 클래스가 존재
- AWT or Swing에서 주로 사용, 그 이외에는 잘 사용하지 않음
- 이벤트를 발생시키는 클래스 내부에 이벤트를 처리해주는 클래스가 들어감
- 사용목적 : 접근지정자의 제한을 덜 받는다.
- 두 클래스간의 멤버변수 접근이 용이

1) 클래스내부에서 또 다른 클래스를 선언

package j0613;
// 3. 내부클래스

import java.awt.*; // awt폴더 안에 있는 파일만 적용, awt내의 다른 폴더는 대상이 아님

// 1) 이벤트 처리에 해당되는 클레스, 인터페이스를 import
import java.awt.event.*;

public class WindowTest3 extends Frame{

        public WindowTest3(String s) {
                super(s);
                setBounds(300,300,400,200);

                this.addWindowListener(new Other2());

                setVisible(true);
        }


        // Adapter 클래스 생성
        class Other2 extends WindowAdapter{

                @Override
                public void windowClosing(WindowEvent e) {
                        // TODO Auto-generated method stub
                        System.out.println("windowClosing"); // 종료버튼을 눌렀을 때
                        System.exit(0); // 종료
                } // inner class

        }

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                new WindowTest3("내부 클래스를 사용하는 경우");
        }

}


*inner Class
형식) OuterClass명$InnerClasee명.class

★ 4. 이름이 없는 내부클래스(Annoymous Inner class)
- class 파일 : WindowTest4$1.class -> 숫자로 표현
- 다른 내부 클래스들과는 달리 이름이 없다.
- 클래스의 선언과 객체의 생성을 동시에 한다.
- 단 한번 사용할 수 있고 오직 하나의 객체만을 생성할 수 있다.
- 일회용 클래스

기본 형식)

class 클래스명{
멤버변수명;
메서드명(){}
}

익명 내부 클래스 형식) 객체를 생성하며 동시에 호출할 메서드명을 같이 작성

[클래스명 객체명]=new 클래스명(){
     멤버변수 선언
     호출할 메서드명();
}

EX)

package j0613;
// 4. 익명 내부클래스

import java.awt.*; // awt폴더 안에 있는 파일만 적용, awt내의 다른 폴더는 대상이 아님

// 1) 이벤트 처리에 해당되는 클레스, 인터페이스를 import
import java.awt.event.*;


public class WindowTest4 extends Frame{

    public WindowTest4(String s) {
        super(s);
        setBounds(300,300,400,200);
        this.addWindowListener(new WindowAdapter(){       
            @Override
            public void windowClosing(WindowEvent e) {
                // TODO Auto-generated method stub
                System.out.println("windowClosing");
                System.exit(0);
            } // inner class
        });       
        setVisible(true);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new WindowTest4("익명 내부 클래스를 사용하는 경우");       
    }
}






*이벤트를 처리할 때
1) Listener
- 단점 : 필요한 이벤트구문 외에 다른 구문도 모두 작성해야 한다. -> 소스코드 낭비
-> 이러한 단점을 보완하기 위한 방법 Adapter

2) Adapter 클래스
- 클래스로 되어있기에 내가 원하는 경우만 메서드를 오버라이딩 가능




[ 버튼 이벤트 처리 ]

1) 화면디자인은 생성자에서

public ButtonEvent() {
                super("버튼의 이벤트 연결"); // setTitle("버튼의 이벤트 연결")
                setBounds(300,200,400,300);
                // 익명 내부 클래스로 창 종료하기
                this.addWindowListener(new WindowAdapter() {
                        @Override
                        public void windowClosing(WindowEvent e) {
                                // TODO Auto-generated method stub
                                System.exit(0);
                        }
                });
                setVisible(true);
        }


2) 부착시킬 컴포넌트는 멤버변수로 선언

Button b1, b2, b3, b4;
        TextField tf1; // 사용자로부터 값을 입력받을 때


3) 부착시킬 컴포넌트 생성 및 부착

// ---- 부착시킬 컴포넌트 생성, 버튼의 이벤트 연결, 배치관리자 변경----
                this.setLayout(new GridLayout(5,1,3,3));
                // GrindLayout gl= new GridLayout(5,1,3,3);
                b1=new Button("시작");
                b2=new Button("고");
                b3=new Button("백");
                b4=new Button("점프");
                tf1=new TextField(" "); //빈문자에 해당하는 텍스트 입력창(TextArea)

                // 부착시키는 순서 : 컴포넌트를 만드는 순서와 정반대
                this.add(b1); add(b2); add(b3); add(b4); add(tf1);



4) 버튼 이벤트 클래스 가져오기

public class ButtonEvent extends Frame implements ActionListener{
...
public void actionPerformed(ActionEvent e) {
                System.out.println(e.getActionCommand());
        }
...
}


- ActionEvent e : 이벤트를 발생시킨 컴포넌트 정보를 가져옴
1) e.getActionCommand() : 이벤트를 발생시킨 컴포넌트의 이름을 얻어온다.
2) e.getSource() : 이벤트를 발생시킨 컴포넌트 종류





'JAVA > Basic' 카테고리의 다른 글

객체형변환, 라이브러리  (0) 2017.06.16
AWT를 Swing으로 전환시키는 방법  (0) 2017.06.16
Scanner / next  (0) 2017.06.16
자바에서의 화면처리(AWT, Swing)  (0) 2017.06.16
재귀호출  (0) 2017.06.16
Comments