히치키치

[명품 자바 에센셜] 실습문제 9장 본문

명품 자바 에센셜

[명품 자바 에센셜] 실습문제 9장

히치키치 2021. 9. 1. 00:41

요약

  • 이벤트 기반 프로그래밍
    이벤트 발생에 의해 프로그램 흐름/실행되는 코드 결정
    이벤트 발생 -> 이벤트 리스너 : 이벤트 처리 루틴 실행
  • 배치 실행 : 개발자가 프로그램 흐름 결정
  • 이벤트 소스 : 이벤트 발생시킨 GUI 컴포넌트
    이벤트 객체 : 발생한 이벤트에 대한 정보 제공 객체
    이벤트 리스너 : 사용자가 작성한 이벤트 처리 자바 프로그램 코드
    이벤트 분배 스레드 : 무한 루프 돌며 이벤트 발생시 이벤트 리스너 찾아 호출하는 스레드
  • 이벤트 처리 과정
    이벤트 발생->이벤트 객체 생성 ->이벤트 리스너 찾기->이벤트 리스너 실행 : 리스너에 이벤트 객체가 전달되며 리스너 코드 실행
  • getSource() : 발생 이벤트 소스 리턴
    Object 타입 리턴임으로 캐스팅하여 사용
  • ActionEvent : JButton : 마우스, <Enter> 키로 버튼 선택
    KeyEvent : Component : 키 누르기, 누른 키 떼기
    MouseEvent : Component : 마우스 조작
  • 이벤트 리스너 작성법 :
    독립 클래스,
    내부 클래스 : InnerClassListener.this.setTitle(b.getText()),
    익명 클래스 : AnnonymousClassListener.this.setTitle(b.getText()),
  • Adapter 클래스
    : ActionLister, ItemListenr는 메소드가 1개라 없음
  • 키 입력의 독점권 :현재 포커스 가진 컴포넌트에만 Key 이벤트 발생
  • component.setFocusable(true) : component가 포커스 받을 수 있도록 설정
    component.requestFocus();: component에게 포커스 줘 키 입력 받게 함
  • 모든 키 입력에 호출되는 KeyListener : keyPressed() -> keyreleased()
  • 유니코드 입력에 호출되는 KeyListener : keyPressed() -> keyTyped()->keyreleased()
  • component.addKeyListener(myKeyListener);
  • char KeyEvent.getKeyChar() : 입력된 키의 유니 코드 값 반환
    (유니코드 아닌 경우 : KeyEvent.CHAR_UNDEFINED 리턴)
  • int KeyEvent.getKeyCode() : 모든 키에 대한 정수형 키 코드 리턴
    (VK_ 의 가상 키 값과 비교)
  • 마우스 눌린 위치에서 뗄 때 호출되는 MouseListener : mousePressed()->mouseReleased()->mouseClicked()
  • 마우스가 드래그된 상태에서 호출되는 이벤트 : mousePressed ->mouseDragged -> ... ->mouseDragged->mouseReleased
  • component.addMouseListener(myMouseListener)
  • component.addMouseModtionListener(myMouseMotionListener)
  • MouseEvent.getX(), MouseEvent.getY() : 마우스 좌표 받기
  • MouseEvent.getClickCount() : 마우스 클릭 횟수 리턴

1번

JLabel 컴포넌트는 Mouse 이벤트를 받을 수 있다. JLabel 컴포넌트의 초기 문자열을 “자기야”라고 출력하고, 레이블에 마우스를 올리면 “사랑해”로, 내리면 “자기야”가 다시 출력되도록 프로그램을 작성하라.

package java_9;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class one extends JFrame{

    public one(){
        this.setTitle("Java");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);

        Container c = getContentPane();

        c.setLayout(new FlowLayout());

        JLabel label=new JLabel("자기야");

        label.addMouseListener(new MouseListener() {
            public void mouseEntered(MouseEvent e) {
                label.setText("사랑해");
        }
            public void mouseExited(MouseEvent e) {
                label.setText("사랑해");
        }
            public void mousePressed(MouseEvent e) {}
            public void mouseReleased(MouseEvent e) {}
            public void mouseClicked(MouseEvent e) {}
        });

        c.add(label);

        this.setSize(300,300);
        this.setVisible(true);

    }

    public static void main(String[] args) {
        new one();
    }

}

2번

프레임의 컨텐트팬의 초기 색을 Color.CYAN으로 하고, R 키를 누르는 순간 배경색이 Color.RED 색으로 변했다가, 키를 떼면 다시 초기 색으로 돌아오는 프로그램을 작성하라.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class two extends JFrame{
    public two() {
        this.setTitle("Java");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);

        Container c = getContentPane();

        c.setBackground(Color.CYAN);
        c.addKeyListener(new KeyListener() {
            public void keyPressed(KeyEvent e) {
                if(e.getKeyChar() == 'R') {
                    c.setBackground(Color.RED);
                }
            }
            public void keyReleased(KeyEvent e) {
                c.setBackground(Color.CYAN);
            }
            public void keyTyped(KeyEvent e) {}
        });

        this.setSize(300, 300);
        this.setVisible(true);

        c.setFocusable(true);
        c.requestFocus();

    }


    public static void main(String[] args) {
        new two();
    }
}

3번

컨텐트팬의 배경색은 초록색(Color.GREEN)으로 하고, 마우스의 드래깅 동안만 노란색(Color.YELLOW)으로 나타나는 프로그램을 작성하라. 드래깅을 멈추면 초록색이 된다

import java.awt.;
import java.awt.event.
;
import javax.swing.*;

import javax.swing.*;

public class three extends JFrame{

public three() {
    this.setTitle("드래깅동안...");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //this.setLocationRelativeTo(null);

    Container c=getContentPane();
    c.setBackground(Color.GREEN);
    c.setLayout(null);
    MyMouseListener listener=new MyMouseListener();
    c.addMouseListener(listener);
    c.addMouseMotionListener(listener);



    //c.addMouseMotionListener(new  MyMouseListener());
    c.setBackground(Color.YELLOW);
    this.setSize(300,300);
    this.setVisible(true);


}
class MyMouseListener implements MouseListener,MouseMotionListener{
    public void mouseReleased(MouseEvent e) {
        Component c=(Component)e.getSource();
        c.setBackground(Color.GREEN);
    }    
    public void mousePressed(MouseEvent e) {}
    public void mouseClicked(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}

    public void mouseDragged(MouseEvent e) {
        Component c=(Component)e.getSource();
        c.setBackground(Color.YELLOW);
    }
    public void mouseMoved(MouseEvent e) {}

}


public static void main(String[] args) {
    new three();
}

}

4번

JLabel 컴포넌트를 이용하여 “Love Java”를 출력하고, + 키를 치면 폰트 크기를 5픽셀씩 키우고, - 키를 치면 폰트 크기를 5픽셀씩 줄이는 스윙 응용프로그램을 작성하라. 5픽셀 이하로 작아지지 않도록 하라.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class four extends JFrame{

    public four() {
        this.setTitle("+,-키로 폰트...");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;

        JLabel label=new JLabel("Love Java");

        Container c=getContentPane();
        c.setLayout(new FlowLayout());
        c.add(label);

        c.addKeyListener(new KeyListener() {

            public void keyPressed(KeyEvent e) {
                if(e.getKeyChar()=='+') {
                    label.setFont(new Font("Arial", Font.PLAIN, label.getFont().getSize() + 5));
                }
                else if ((e.getKeyChar()=='-') && (label.getFont().getSize()>10)){
                    label.setFont(new Font("Arial", Font.PLAIN, label.getFont().getSize() - 5));
                }
            }

            public void keyReleased(KeyEvent e) {}
            public void keyTyped(KeyEvent e) {}
        });





        c.setFocusable(true);
        c.requestFocus();

        this.setSize(300,300);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new four();
    }
}

5번

클릭 연습용 스윙 응용프로그램을 작성하라. JLabel을 이용하여 문자열 “C”인 레이블을 하나 만들고 초기 위치를 (50, 50)으로 하라. 문자열을 클릭할 때마다 레이블은 프레임 내의 랜덤한 위치로 움직인다.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class five extends JFrame{
    int x,y;
    public five() {

        this.setTitle("Java");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c=getContentPane();
        JLabel label=new JLabel("C");
        c.setLayout(null);

        label.setBounds(50,50,40,40);

        label.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent e) {
                x = (int)(Math.random()*(getContentPane().getWidth() - label.getWidth()));
                y = (int)(Math.random()*(getContentPane().getHeight() - label.getHeight()));
                label.setLocation(x, y);
            }
            public void mousePressed(MouseEvent e) {}
            public void mouseReleased(MouseEvent e) {}
            public void mouseEntered(MouseEvent e) {}
            public void mouseExited(MouseEvent e) {}
        });

        c.add(label);
        this.setSize(300,300);
        this.setVisible(true);


    }
    public static void main(String[] args) {
        new five();
    }

}

6번

GridLayout을 이용하여 컨텐트팬에 숫자를 담은 JLabel을 12개를 부착하고, 초기 바탕색을 모두 Color.WHITE 색으로 한다. 그리고 각 레이블 위에 마우스로 클릭하면 랜덤한 색으로 채워지도록 프로그램을 작성하라. 랜덤한 색을 만드는 방법은 예제 9-6의 코드를 참고하라.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class six extends JFrame{

    public six() {

        this.setTitle("3 x 4 color frame");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);;

        Container c=getContentPane();
        c.setLayout(new GridLayout(3,4));
        this.setSize(300,300);
        this.setVisible(true);

        for(int i=0;i<12;i++) {
            String text=Integer.toString(i);
            JLabel label=new JLabel(text);
            c.add(label);
            label.addMouseListener(new MouseListener() {
                public void mouseClicked(MouseEvent e) {
                    JLabel label=(JLabel)e.getSource();
                    int r=(int)(Math.random()*256); 
                    int g=(int)(Math.random()*256); 
                    int b=(int)(Math.random()*256); 
                    label.setOpaque(true);
                    label.setBackground(new Color(r,g,b));
                }
                public void mousePressed(MouseEvent e) {}
                public void mouseReleased(MouseEvent e) {}
                public void mouseEntered(MouseEvent e) {}
                public void mouseExited(MouseEvent e) {}                
            });
        }

    }

    public static void main(String[] args) {
        new six();
    }
}
Comments