붓, 그리다
화면 배치, 이벤트 처리 본문
[ 화면에 배치시키는 방법 ]
- 배치관리자를 이용
- 레이아웃 변경 메서드
대상자.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