JAVA

[JAVA] AWT.EVENT

sian han 2022. 4. 6. 20:20

※ 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