※ Event
- 사용자나 프로그램 코드에 의해서 발생할 수 있는 사건
ex ) 사용자가 마우스를 움직이거나 클릭할 때, 키보드를 눌렀을 때, Frame의 크기를 변경할 때 이벤트 발생
· Event Source : 이벤트 발생지
- 이벤트가 발생한 컴포넌트
· Event Handler : 이벤트 처리기
- 이벤트가 발생했을 때 실행될 코드를 구현 해 놓은 클래스
· Event Listener : 이벤트 감지기
- 이벤트를 감지하고 처리함
= > ★ Event Handler를 Event Listener를 이용해 Event Source에 연결해 이벤트 처리를 하는 것.
- 이벤트 처리 ? : 이벤트가 발생했을때 적절한 작업수행하는 것
▶ 이벤트 처리방법
1 ) 이벤트 메서드 중에서 필요한 것 (windowClosing) 을 찾는다
windowClosing(WindowEvent e)
2 ) 선택한 메서드가 속해있는 인터페이스( WindowListener)를 구현하는 클래스를 작성한다
class EventHandler implements WindowListener
{
public void windowClosing(WindowEvent e) {코드작성}
...
}
3 ) 위에서 구현한 클래스의 인스턴스(=객체)를 생성해서 이벤트 소스에 Listener로 등록(add~)한다
f.addWindowListener(new EventHandler());
= > 창닫으려면 windowClosing() 메서드를 사용해야하는데 이건 WindowListener인터페이스 안에 들어있다
WindowListener 인터페이스를 구현하는 클래스를 작성해서 windowClosing() 메서드를 오버라이딩해서 사용하면됨
근데 이제 인터페이스라서 WindowListener 내의 모든 메서드들을 구현해야됨 .. 겁내많음
그래서 더 편하게 windowClosing()를 사용하는 방법 = Adapter 클래스 사용하기
▶ Adapter 클래스
- 해당 이벤트 리스너에 정의 된 모든 추상 메서드를 구현해야 한다는 불편한 점을 없애기 위해 고안된 것
- 이벤트 처리에 필요한 메서드만 작성하면 됨
- 이벤트 리스너를 직접 구현하는 대신에 Adapter 클래스를 상속받아서 원하는 메서드만 작성(오버라이딩)하면 됨
예제 ) WindowClosing()
[1] Adapter 클래스를 상속받는 Handler 클래스를 만들어서 WindowClosing 메서드를 오버라이딩하고
class Handler extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
[2] 만든 클래스를 Frame 에 연결시켜준다
this.addWindowListener(new Handler());
[ 외전 ] 메서드 한개만 가져와서 오버라이딩 하는것이기 때문에 이렇게 init() 에 익명클래스로 만들어된다
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); //익명 클래스
Q. 내가 사용할 메서드가 어느 인터페이스에 속해있는지 어떻게 알아요 ?
제가 사용해야할 메서드가 뭔지도 모르겠어요 ㅠ ㅠ . .
★<이럴 때 이런 인터페이스에서 이런 메서드를 사용합니다>★
[ ActionListener ]
▷ 상황 : 뭔가 ! 중요한 액션을 취한것들
버튼클릭
메뉴클릭
TextField 에서 enter 키
ListItem 선택해서 더블클릭
▷ 메서드 : actionPerformed(ActionEvent e)
[ KeyListener ]
▷ 상황 : 키보드를 눌렀거나 그와 유사한 어떠한 액션(..)을 취했을때
▷ 메서드
keyPressed(KeyEvent e) : 키보드의 키를 눌렀을 때
keyReleased(KeyEvent e) : 뗀거 3 ★ 많이씀 - 키보드의 키를 떼었을 때 (떼서 뭔가 완료되었을때)
keyTyped(KeyEvent e) : 그 사이 2 - 키보드의 키를 눌렀다 떼었을 때
ex ) tf가 모두 입력되면 자동으로 rd2 가 선택되게하는 이벤트
rd.setSelected(true)
public void keyReleased(KeyEvent e) {
if(e.getSource() == tfPrice1 || e.getSource() == tfPrice2){
int len1 = tfPrice1.getText().length(); //getText() : String 반환값인데 int로 자동형변환됨
int len2 = tfPrice2.getText().length();
if(len1>0 && len2>0){ //tf1,tf2 가 모두 입력되면(0보다 크면)
rdPrice.setSelected(true); //rdPrice 가 선택되어라
}
}
}
[ TextListener ]
▷ 상황 : 텍스트 값 변화
▷ 메서드 : textValueChanged(TextEvent e)
[ ltemListener ]
▷ 상황 : status 가변경되었을때, 체크박스나 라디오에서 체크했을때,리스트에서 뭔가 하나 선택했을때 or 해제되었을때 등 상태가변경되었을때
▷ 메서드 : itemStateChanged(ItemEvent e) :
Checkbox, CheckboxMenuItem, List, Choice 의 status가 변경되었을 때 (selected <-> unselected)
ex ) 콤보박스에서 항목선택하면 rd 가 자동으로 선택되게
e.getSource()==cbPdName => 소스가 콤보인데
ItemEvent.SELECTED => 콤보가 선택되면
rdPdName.setSelected(true) => rd 를 선택되게
cbPdName.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getSource()==cbPdName){
if(e.getStateChange() == ItemEvent.SELECTED){
rdPdName.setSelected(true);
}
}
} // 익명클래스로 작성=> 한번만이용할꺼니까
}
[ MouseListener ]
▷ 상황 : 마우스 클릭에 관한 액션을 했을 때
▷ 메서드
mousePressed(MouseEvent e) : 마우스 눌렀다
mouseReleased(MouseEvent e) : 뗐다
mouseClicked(MouseEvent e) : 눌렀다뗐다 (★자주씀)
ex ) 테이블을 선택하면 그 행의 번호를 읽어와서 tf에 뿌려줌
e.getSource() == table => 소스 : 테이블을 클릭하면
int row =table.getSelectedRow() => 행번호를 가져와서 int 로 받은다음 (내가 찾으려는 no는 0번째 열에 있으니까)
Object objNo = table.getValueAt(row,0); => getValueAt(int row,int column) 반환 obj
public void mouseClicked(MouseEvent e) {
if(e.getSource() == table){
try {
int row =table.getSelectedRow();
Object objNo = table.getValueAt(row,0);
String no = (String)objNo; //String 으로 변환해줌
PdDTO dto = pdDao.selectByNo(Integer.parseInt(no));
tfNo.setText(Integer.toString(dto.getNo())); //textfield 는 string으로 세팅해야함
tfPdName.setText(dto.getPdName());
tfPrice.setText(dto.getPrice()+""); //String 변환 (뒤에 ""붙여서)
taDesc.setText(dto.getDescription());
tfRegdate.setText(dto.getRegdate().toString()); //String 변환 (regdate 에는 tostring 메서드가 있음)
} catch (SQLException ex) {
Logger.getLogger(ProductGUI.class.getName()).log(Level.SEVERE, null, ex);
}
=> 행번호 받아와서 행,열번호로 특정행 데이터의 seq번호를 받아서 String 으로 변환한 다음
DAO 의 selectByNo 메서드 사용해서 해당 행의 데이터 dto 로 받아준 다음 tf 에 set 해서 뿌려준다
ex ) 다른 탭 선택했다가 돌아오면 tf 리셋되어있게
tappedPane.getSelectedIndex() : 선택한 tappedpane 의 인덱스 번호를 return 한다
else if(e.getSource() == tappedPane){
int idx = tappedPane.getSelectedIndex();
if(idx == 0){
System.out.println("상품등록 탭 클릭"); //상품등록 탭은 0번째 탭이니까
clear_tf();
}else if(idx == 1){
System.out.println("상품검색 탭 클릭!!");
clear_tf2();
}
. . . .
private void clear_tf2() {
//상품검색에서 작업하다가 상품등록 택 들어갔다가 상품검색 다시들어가면 tf 클리어되어있음
rdPdName.setSelected(true); //rf1이 선택되어있게끔(true) 세팅
tfPrice1.setText("");
tfPrice2.setText("");
cbPdName.setSelectedIndex(0); // 리스트 0번째가 선택되어있게끔 세팅
}
[ MouseMotionListener ]
▷ 메서드
mouseDragged(MouseEvent e) : 마우스 누른상태에서 드래그
mouseMoved(MouseEvent e) : 마우스 그냥 드래그
[ WindowListener ]
▷ 메서드
windowClosing : frame 닫기


▷ 코드 형식
- 나만 .. 쉽게 이해할 수 있음 된다 .. !!
frame 상속받는 클래스{
멤버변수 선언;
생성자{
멤벼변수 객체생성;
프레임 디자인;
이벤트 연결; // 참조변수.리스너(핸들러 객체);
}
}
사용할리스너를 implements 하는 핸들러 클래스 {
리스너 안의 메서드 오버라이딩
}
메인메서드{
프레임 객체생성
visible : true
}
public class ButtonActionEvent extends Frame{
private Button bt;
private TextField tf;
private Label lbResult;
public ButtonActionEvent() {
super("버튼 클릭 연습");
this.setLayout(new FlowLayout());
bt=new Button("확인");
tf=new TextField(20);
lbResult=new Label("여기에 결과가 출력됩니다.");
this.add(tf);
this.add(bt);
this.add(lbResult);
this.setSize(300, 200);
this.setVisible(true);
bt.addActionListener(new EventHandler());
//버튼클릭이벤트 : ActionListener
}
class EventHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String cmd=e.getActionCommand();
//getActionCommand():이벤트소스[버튼]의 라벨(문자열)을 돌려준다.
lbResult.setText(tf.getText()+", " + cmd+"버튼 클릭됨!");
//setText 로 찍고 getText 로 가져옴
}
}//내부 클래스
public static void main(String[] args) {
ButtonActionEvent f = new ButtonActionEvent();
f.setVisible(true);
}
}
코딩처리과정 :
타자치고 버튼눌렀을 때 문자열을 돌려주는 이벤트를 생성하고싶은데 !
버튼 누르는거니까 ActionListener 사용해야겠다
ActionListener 인터페이스를 implements 하는 EventHandler 클래스를 작성하는데,
이 클래스에서 actionperformed 메서드를 오버라이딩 해주자 !
그리고 버튼에 리스너로 소스랑 핸들러를 연결해주자
마지막으로 메인에서 객체 생성해서 구현해주면 끝 !
디자인 - init()
이벤트 연결 - addEvent()
이렇게 따로 메서드 만들어서 모듈화 해주면 더 깔끔하다 !
▽ 이런식으로
import java.awt.*;
public class MouseTest extends Frame {
Label lb;
public MouseTest() {
super("MouseEvent");
init();
addEvent();
}
private void init() { // 프레임 디자인
setSize(400,300); //this 생략가능
setLayout(new FlowLayout(FlowLayout.LEFT));
lb = new Label("Mouse Pointer Location : ");
lb.setBackground(Color.yellow);
add(lb);
}
private void addEvent() {
this.addMouseMotionListener(new EventHandler());//프레임에 연결
}
class EventHandler implements MouseMotionListener{//어댑터써도되는데 implement 로 함
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
lb.setText("Mouse Pointer Location : x = "+e.getX()+", y = "+e.getY());
} // 마우스의 x,y위치를 알 수 있다
}//inner class
public static void main(String[] args) {
MouseTest f = new MouseTest();
f.setVisible(true);
}
}
'JAVA' 카테고리의 다른 글
| [JAVA] IO (0) | 2022.04.13 |
|---|---|
| [JAVA] GUI / 계속 추가예정 (0) | 2022.04.11 |
| [JAVA] AWT (0) | 2022.04.05 |
| [JAVA] DTO / DAO (0) | 2022.04.04 |
| [JDBC] 오라클 developer - JAVA eclipse 연동 / JDBC 프로그래밍 순서 (0) | 2022.04.01 |