자바실무 제 3강[KNU 2021-2]
👨💻🏫KNU 2021-2 SW & media 자바실무 필기노트 3
1. 이벤트 기반 프로그래밍
이벤트의 종류
- 사용자의 입력,네트위크데이터 송수신
- 응용프로그램으로부터의 피드백
이벤트의 사용방식
- 실행 타이밍이 이벤트의 발생으로 인해 트리거됨
- 이벤트 발생시 이벤트 처리 루틴 실행
이벤트 기반 프로그램의 구조
- 이벤트 처리루틴인 이벤트리스너의 집합이다.
이벤트 처리순서
- 이벤트발생 -> 이벤트객체생성 -> 이벤트리스너호출 -> 이벤트리스너실행
이벤트기반 응용프로그램의 계층도 | |
---|---|
이벤트 리스너 |
|
이벤트분배스레드 | 응용프로그램↑ |
JVM | |
OS | |
하드웨어 | |
실제 발생한 행위 | —————↑ |
- 소스: 이벤트를 발생시키는 컴포넌트로 AWTEvent로부터 상속된다
- 객체: 발생 이벤트에 대한 정보(종류,소스,좌표,입력횟수,체크상태…등)
- 리스너: 클래스형의 이벤트 처리코드로 컴포넌트로부터 상속됨
- 분배스레드: JVM으로부터 소스와 종류를 결정하여 객체생성 및 호출
2.이벤트 리스너 작성 과정
- 이벤트와 이벤트 리스너 선택
- 이벤트 리스너 클래스 작성
- 이벤트 리스너 등록
3.이벤트 리스너 작성 방법
- 독립 클래스로 작성
완전한 클래스로 작성. 여러 곳에서 사용할 때 적합. - 내부 클래스로 작성
클래스 내에 멤버처럼 클래스를 작성하는 방식이다. 특정 클래스내에서만 구동될때 적합 - 익명 클래스로 작성
클래스명없이 작성되며 간단한 코드에 적합. C++에서 함수 인자로 함수가 있다고 보면된다.(클래스 작성과 인스턴스 생성을 동시에)
예제 1. 독립 클래스로 Action 이벤트의 리스너 작성
// 독립된 클래스로 이벤트 리스너를 작성한다.(추상 애드온)
class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JButton b = (JButton)e.getSource(); // 이벤트 소스 버튼 알아내기
if(b.getText().equals("Action")) // 버튼의 문자열이 "Action"인지 비교
b.setText("액션"); // 버튼의 문자열을 "액션"으로 변경
else
b.setText("Action"); // 버튼의 문자열을 "Action"으로 변경
}
}
예제 2. 내부 클래스로 Action 이벤트의 리스너 작성
private class MyActionListener// 내부 클래스로 Action 리스너를 작성한다.
implements ActionListener
{
public void actionPerformed(ActionEvent e) {
JButton b = (JButton)e.getSource();
if(b.getText().equals("Action"))
b.setText("액션");
else
b.setText("Action");
// InnerClassListener의 멤버나 JFrame의 멤버를 호출할 수 있음
InnerClassListener.this.setTitle(b.getText()); // 프레임의 타이틀에 버튼 문자열을 출력한다.
}
}
예제 3. 익명 클래스로 Action 이벤트의 리스너 작성
btn.addActionListener(new ActionListener() {//버튼의 인자부분에 작성
public void actionPerformed(ActionEvent e) {
JButton b = (JButton)e.getSource();
if(b.getText().equals("Action"))
b.setText("액션");
else
b.setText("Action");
// AnonymousClassListener의 멤버나 JFrame의 멤버를 호출할 수 있음
setTitle(b.getText());
}
});
4. 리스너인터페이스 사용법
4.1 키 이벤트 리스너 등록과 키 리스너 사용
이벤트리스너 등록
component.addKeyListener(new myKeyListener())
키 리스너의 메소드 유형
void keyPressed(KeyEvent e){//}
void keyTyped(KeyEvent e){//유니코드에서만 적용되며 ctrl과 같은 제어키는 패스}
void keyRelesed(KeyEvent e){//}
이벤트 객체
int getKeyCode() //
문자코드(유니코드)
리턴
char getKeyChar() //모든키에대해 작동하며가상키
값을 리턴
string getKeyText(int keycode) //stctic메소드로 키코드에 해당되는키 이름
문자열 리턴
가상키(VirtualKey;VK):
유니코드를 포함해 모든키에는 가상키가 적용된다. 이 값으로 어떤키가 입력되었는지를 알 수 있다.
예제 4. 좌,우측버튼 입력받기
/*생략*/
label.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {//좌,우측버튼 눌릴때 현재 텍스트를 거꾸로 표시한다
if(e.getKeyCode() == KeyEvent.VK_LEFT) {
JLabel la = (JLabel)e.getSource();
StringBuffer text = new StringBuffer(la.getText());
la.setText(text.reverse().toString());
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
JLabel la = (JLabel)e.getSource();
StringBuffer text = new StringBuffer(la.getText());
la.setText(text.reverse().toString());
}
}
@Override
public void keyReleased(KeyEvent e) {//좌,우측버튼의 입력 끝날때 텍스트를 바꾼다.
if(d.getKeyCode() == KeyEvent.VK_LEFT) {
JLabel la = (JLabel)e.getSource();
StringBuffer text = new StringBuffer(la.getText());
la.setText("LEFT KEY PRESSED");
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
JLabel la = (JLabel)e.getSource();
StringBuffer text = new StringBuffer(la.getText());
la.setText("RIGHT KEY PRESSED");
}
}
});
/*생략*/
4.2 마우스 이벤트 리스너 등록과 마우스 리스너 사용
이벤트리스너 등록
MouseListener listener= new MyMouseListener();
component.addMouseListener(listener);
component.addMotionListener(listener);
위치 관련 메소드(마우스리스너)
void mouseEntered(KeyEvent e){//컴포넌트위에 올라갈때}
void mouseExited(KeyEvent e){//컴포넌트에서 내려올때}
클릭 관련 메소드(마우스리스너)
void mousePressed(KeyEvent e){//버튼이 눌렸을때}
void mouseRelesed(KeyEvent e){//눌린 버튼이 떼어질때}
void mouseClicked(KeyEvent e){//클릭하였을떄}
드래그 관련 메소드(마우스모션리스너)
void mousePressed(KeyEvent e){//}
void mouseMoved(KeyEvent e){//마우스 이동하는 동안}
void mouseDragged(KeyEvent e){//드래그되는 동안}
void mouseRelesed(KeyEvent e){//}
이벤트 객체
int getX(), int getY(), point getPoint() //x,y,위치(x,y)
int getButtion() //입력된 마우스버튼 MouseEvent.BUTTONn(좌:1,중:2,우:3)
int getClickCount() //클릭횟수
예제 5. 마우스 (모션) 리스너 사용해보기
/*생략*/
MyMouseListener ml = new MyMouseListener();
c.addMouseMotionListener(ml);
c.addMouseListener(ml);
label.addMouseListener(new MouseAdapter(){
@Override public void mouseEntered(MouseEvent e){
JLabel la = (JLabel)e.getSource();
label.setForeground(Color.RED);
la.setText("Entered"); //마우스가 라벨을 가르키면 "Entered"
}
@Override public void mouseExited(MouseEvent e){
JLabel la = (JLabel)e.getSource();
label.setForeground(Color.RED);
la.setText("Exited"); //마우스가 라벨을 안 가르키면 "Exited"
}
});
/*생략*/
class MyMouseListener extends MouseAdapter{
@Override public void mouseDragged(MouseEvent e){
JComponent c = (JComponent)e.getSource();
c.setBackground(Color.YELLOW); //마우스 드래깅시 배경색 노랑색
}
@Override public void mouseReleased(MouseEvent e){
JComponent c = (JComponent)e.getSource();
c.setBackground(Color.GREEN); //마우스 드래깅 아닐시 배경색 초록색
}
}
5. 어댑터 클래스
이벤트 리스너 작성시 모든 추상 메소드를 구현해야하는 부담이있기에 모든 메소드가 단순 리턴하도록 구현된 클래스인 어댑터 클래스를 사용할수있다. 추상 메소드가 하나뿐인 리스너에는 어댑터클래스가 없다.
리스너사용
contentPane.addMouseListener(new MyMouseListner());
/**/
class MyMouseListner implements MouseListner{//모든 메소드}
어댑터사용
contentPane.addMouseListener(new MyMouseAdapter());
/**/
class MyMouseListner extends MouseAdapter{//메소드 생략가능}
6. 키 이벤트와 포커스
포커스란 컴포넌트나 응용프로그램이 키 이벤트를 독점하는 권한으로 키 이벤트를 받을수있는 조건이다. 포커스를 위해서는 다음의 코드가 필요하다.
스윙프레임이 만들어질때 포커싱
component.setFoucusable(true);//컴포넌트가 포커스를 받을수있도록 변경
component.requestFocus();//컴포넌트에 강제 포커스 지정
컴포넌트를 클릭할때 포커싱
component.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
Component component = (Component)e.getSource(); //컴포넌트가 클릭될때
component.setFocusable(true);
component.requestFocus(); //컴포넌트에 강제 포커스 지정
}
});
댓글남기기