명품자바프로그래밍 10장 이벤트 처리
10장. 자바의 이벤트 처리 요약
이벤트 기반 프로그래밍 : 이벤트의 발생에 의해 프로그래밍
이벤트 소스 :
이벤트 객체 :
*ActionEvent, MouseEvent 많이 씀
이벤트 리스너 :
- 독립 클래스 :
- 내부 클래스 :
- 익명 클래스 :
어댑터 클래스
keyEvent 와 keyListener
-component.setFocusable(true);
-component.requestFocus();
keyTyped()
MouseEvent, MouseListener, MouseMotionListener, MouseWheelListener
키
유니코드키
유니코드가 아닌 키
가상 키
10장. 자바의 이벤트 처리 예제
| 예제 10-1 | 버튼을 클릭할 때 발생하는 Action 이벤트를 처리할 MyActionListener 클래스를 독립클래스로 작성하고 클릭할 때마다 버튼 문자열이 "Action"과 "액션"으로 번갈아 변하도록 하라.
※ 독립클래스로 Action 이벤트의 리스너 작성
package test10;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
/*class MyAction implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
JButton b=(JButton)arg0.getSource(); //이벤트 발생한 소스를 얻는다
if(b.getText().equals("Action"))
b.setText("액션");
else b.setText("Action");
}
}*/
public class EventTest01 extends JFrame {
JButton btn;
EventTest01() {
setTitle("이벤트처리");
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new FlowLayout());
btn=new JButton("Action");
c.add(btn);
setVisible(true);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
JButton b=(JButton)arg0.getSource(); //이벤트 발생한 소스를 얻는다
if(b.getText().equals("Action"))
b.setText("액션");
else b.setText("Action");
}
});
}
public static void main(String[] args) {
new EventTest01();
}
/*class MyAction implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
JButton b=(JButton)arg0.getSource(); //이벤트 발생한 소스를 얻는다
if(b.getText().equals("Action"))
b.setText("액션");
else b.setText("Action");*/
}
| 예제 10-2 | 10-1과 같은 내용을 내부 클래스로 이벤트 리스너를 만들어보자.
※ 내부클래스로 Action 이벤트의 리스너 작성
package test10;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
//class MyAction implements ActionListener{
// private JTextField tf1, tf2;
// private JLabel la;
// MyAction(JTextField tf1, JTextField tf2, JLabel la){
// this.tf1=tf1;
// this.tf2=tf2;
// this.la=la;
// }
// @Override
// public void actionPerformed(ActionEvent arg0) {
// //JButton b=(JButton)arg0.getSource();
// int num1=Integer.parseInt(tf1.getText());
// int num2=Integer.parseInt(tf2.getText());
// la.setText((num1+num2)+" ");
//
// }
//
//}
public class EventTest02 extends JFrame {
JTextField tf1, tf2;
JLabel la; //값이 안바뀌어서 만들필요 ㄴㄴ
JButton btn;
EventTest02() {
setTitle("이벤트처리");
setSize(200, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new GridLayout(4,1));
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
tf1 = new JTextField(10);
p1.add(new JLabel("숫자1: "));
p1.add(tf1);
tf2 = new JTextField(10);
p2.add(new JLabel("숫자2: "));
p2.add(tf2);
la=new JLabel("처리결과");
p3.add(new JLabel("계산결과"));
p3.add(la);
btn=new JButton("더하기");
c.add(p1);
c.add(p2);
c.add(btn);
c.add(p3);
setVisible(true);
btn.addActionListener(new MyAction());
}
public static void main(String[] args) {
new EventTest02();
}
class MyAction implements ActionListener{
// private JTextField tf1, tf2;
// private JLabel la;
// MyAction(JTextField tf1, JTextField tf2, JLabel la){
// this.tf1=tf1;
// this.tf2=tf2;
// this.la=la;
// }
@Override
public void actionPerformed(ActionEvent arg0) {
//JButton b=(JButton)arg0.getSource();
int num1=Integer.parseInt(tf1.getText());
int num2=Integer.parseInt(tf2.getText());
la.setText((num1+num2)+" ");
}
}
}
| 예제 10-3 | 10-1, 10-2와 같은 내용을 내부 클래스로 이벤트 리스너를 만들어보자.
※ 익명클래스로 Action 이벤트의 리스너 작성
대기중
| 예제 10-4 | 컨탠트팬의 아무 위치에 마우스버튼을 누르면 마우스 포인트가 있는 위치로 "hello"문자열을 옮기는 스윙 응용프로그램을 작성하라. #마우스이벤트연습
package test10;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MouseTest extends JFrame implements MouseListener{
JLabel la;
Container c;
MouseTest(){
setTitle("Mouse 이벤트예제");
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
c=getContentPane();
c.setLayout(null);
la=new JLabel("Hello");
la.setSize(50,20);
la.setLocation(10, 10);
c.add(la);
setVisible(true);
c.addMouseListener(this);
}
public static void main(String[] args) {
new MouseTest();
}
@Override
public void mouseClicked(MouseEvent arg0) {
// 좌표가 없어도 됨
// c.setBackground(Color.RED);
}
@Override
public void mouseEntered(MouseEvent e) {
// 마우스가 화면 안에 들어올 때
// c.setBackground(Color.BLACK);
}
@Override
public void mouseExited(MouseEvent e) {
// 마우스가 화면 밖에 나갈 때
// c.setBackground(Color.YELLOW);
}
@Override
public void mousePressed(MouseEvent e) {
int x=e.getX();
int y=e.getY();
la.setLocation(x, y); //클릭하는 위치
}
@Override
public void mouseReleased(MouseEvent e) {
// 안쓴다고 지우면 에러납니다.
// 키를 떼는 순간
}
}
| 예제 10-5 | MouseAdapter를 이용하여 예제 10-4를 수정하라.
package test10;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MouseAdapterTest extends JFrame {
JLabel la;
MouseAdapterTest(){
setTitle("마우스어댑터테스트");
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(null);
la=new JLabel("Hello");
la.setBounds(10,10,50,20);
c.add(la);
setVisible(true);
c.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
int x=e.getX();
int y=e.getY();
la.setLocation(x, y);
}
});
}
public static void main(String[] args) {
new MouseAdapterTest();
}
}
| 예제 10-6 | 입력된 키의 키코드, 유니코드, 키의 이름 문자열을 읽는 코드.
※ keyEvent와 keytListener의 활용
package test10;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class KeyEventTest01 extends JFrame implements KeyListener{
private JLabel[] keyMessage;
KeyEventTest01(){
setTitle("keyListener 예제");
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new FlowLayout());
c.addKeyListener(this);
keyMessage=new JLabel[3];
keyMessage[0]=new JLabel("getKeyCode");
keyMessage[1]=new JLabel("getKeyChar");
keyMessage[2]=new JLabel("getKeyText");
for(int i=0; i<keyMessage.length; i++) {
c.add(keyMessage[i]);
keyMessage[i].setOpaque(true); //레이블 배경은 기본이 투명. 텍스트는 아님!
keyMessage[i].setBackground(Color.YELLOW);
}
setVisible(true);
c.setFocusable(true); //포커스 받을 수 있게 함
c.requestFocus();
}
public static void main(String[] args) {
new KeyEventTest01();
}
@Override
public void keyPressed(KeyEvent arg0) {
//눌러졌을때 키코드를 얻음
//1번 (작동순서)
int keyCode=arg0.getKeyCode();
int keyChar=arg0.getKeyChar();
String keyStr=arg0.getKeyText(keyCode);
keyMessage[0].setText(keyCode+"");
keyMessage[1].setText(keyChar+"");
keyMessage[2].setText(keyStr+"");
}
@Override
public void keyReleased(KeyEvent arg0) {
//3번
// int keyCode=arg0.getKeyCode();
// int keyChar=arg0.getKeyChar();
// String keyStr=arg0.getKeyText(keyCode);
// keyMessage[0].setText(keyCode+"");
// keyMessage[1].setText(keyChar+"");
// keyMessage[2].setText(keyStr+"");
//
}
@Override
public void keyTyped(KeyEvent arg0) {
//2번.유니코드만 받습니다.
// int keyCode=arg0.getKeyCode();
// int keyChar=arg0.getKeyChar();
// //String keyStr=arg0.getKeyText(keyCode);
// keyMessage[0].setText(keyCode+"");
// keyMessage[1].setText(keyChar+"");
// keyMessage[2].setText("");
//
}
}
| 예제 10-7 | 다음 그림과 같이 <F1> 키를 입력받으면 콘텐트팬의 배경을 초록색으로, % 키를 입력받으면 노란색으로 변경하는 응용프로그램을 만들어라.
※ 사용자가 키를 입력하면 입력된 키의 이름 문자열을 화면에 출력한다. %키는 shift 키 입력 후 5를 입력한 경우로서 최종적으로 입력된 키는 5이므로 오른쪽 화면에 5키가 입력되었음이라고 출력되어 있다. f1키를 받기 위해 KeyEvent의 getKeycode()메소드를 이용하여야 하며, % 키는 getKeyChar() 메소드를 이용하면 된다.
| 예제 10-8 | 상,하,좌,우 키를 이용하여 "Hello" 문자열을 움직이는 응용프로그램을 작성하라.
※ "Hello" 문자열은 JLabel 컴포넌트로 만들어 컨텐트팬에 부착하고 상,하, 좌,우 키를 움직이면 키 방향으로 한 번에 10픽셀씩 움직인다 이를 위해 컨텐트팬의 배치관리자를 삭제하여야 한다. "Hello" 문자열을 초기에 (50,50) 위치에 출력하라.
package test10;
import java.awt.Container;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class p1008 extends JFrame{
JLabel la;
int x=50, y=50;
p1008(){
setTitle("10장 8번 예제");
setSize(300, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(null);
la=new JLabel("Hello");
la.setBounds(x,y,30,20);
c.add(la);
c.setFocusable(true);
c.requestFocus();
setVisible(true);
c.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch((int) e.getKeyCode()) {
case KeyEvent.VK_UP:
if(y-10<0)
y=0;
else
y-=10;
break;
case KeyEvent.VK_DOWN:
if(y+10>c.getHeight()-20)
y=c.getHeight()-20;
else
y+=10;
break;
case KeyEvent.VK_LEFT:
if(x-10<0)
x=0;
else
x-=10;
break;
case KeyEvent.VK_RIGHT:
if(x+10>c.getWidth()-30)
x=c.getWidth()-30;
else
x+=10;
}
la.setLocation(x, y);
//이미 있는 위치 옮기는 것은 repaint가 필요없음
}
});
}
public static void main(String[] args) {
new p1008();
}
}
| 예제 10-9 | 입력된 키의 키코드, 유니코드, 키의 이름 문자열을 읽는 코드.
※ keyEvent와 keytListener의 활용
package test10;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class MouseEventTest02 extends JFrame{
JLabel la;
Container c;
MouseEventTest02(){
setTitle("10-9");
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
c=getContentPane();
c.setLayout(new FlowLayout());
la=new JLabel("No Mouse Event"); //메모리 할당
c.add(la);
setVisible(true);
MyMouseListener l=new MyMouseListener();
c.addMouseListener(l);
c.addMouseMotionListener(l);
}
public static void main(String[] args) {
new MouseEventTest02();
}
class MyMouseListener implements MouseListener,MouseMotionListener {
@Override
public void mouseDragged(MouseEvent arg0) {
la.setText("mouseDragged("+arg0.getX()+","+arg0.getY()+")");
}
@Override
public void mouseMoved(MouseEvent arg0) {
la.setText("mouseMoved("+arg0.getX()+","+arg0.getY()+")");
}
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent arg0) {
c.setBackground(Color.CYAN);
}
@Override
public void mouseExited(MouseEvent arg0) {
c.setBackground(Color.MAGENTA);
}
@Override
public void mousePressed(MouseEvent arg0) {
la.setText("mousePressed("+arg0.getX()+","+arg0.getY()+")");
}
@Override
public void mouseReleased(MouseEvent arg0) {
la.setText("mouseReleased("+arg0.getX()+","+arg0.getY()+")");
}
}
}
| 예제 10-10 |...
'Java Friends > Java' 카테고리의 다른 글
자바로 로또 복권 번호 랜덤 생성 소스코드 (0) | 2019.10.14 |
---|---|
명품자바프로그래밍 11장 요약,예제 (0) | 2019.07.21 |
명품자바프로그래밍 9장 실습문제 (0) | 2019.07.21 |
명품자바프로그래밍 9장 연습문제 (5) | 2019.07.21 |
명품자바프로그래밍 9장 요약, 예제 (0) | 2019.06.09 |