P9_6 마우스를 눌러 원을 그리는 프로그램을 작성하시오. 마우스 누름을 천천히 (더블클릭 아님!) 두 번 할 때마다 원이 하나씩 그려지게 하시오. 첫 번째 누름 위치는 원의 중심이 되고 두 번째 누르는 점은 원주 위에 있게 하시오. 새 원이 그려지면 기존 원은 없어집니다. 아래 뼈대를 참고하시오.
public class CircleComponentViewer{
public static void main(String[] args){
CircleComponent component = new CircleComponent();// 그림이 그려질 컴포넌트
// 컴포넌트를 인자로 삼아 마우스리스너 구성자를 호출함에 유의!
MouseListener listener = new MousePressListener(component);
component.addMouseListener(listener);// 마우스리스너를 컴포넌트에 등록
JFrame frame = new JFrame();
***********************
}
}
class MousePressListener implements MouseListener{
public MousePressListener(CircleComponent comp){
component = comp;
}
public void mousePressed(MouseEvent event){// 마우스가 눌려질 때마다 실행되는 메소드
int x = event.getX();// CircleComponent위에서 마우스 클릭된 위치를 알아냄
int y = event.getY();
if(clickCount==1){// 첫 클릭이면 그 좌표를 원의 센터로 기억하고 count 증가
*************// 컴포넌트의 setCenterPosition 메소드를 이용!
}else if(clickCount==2){// 두 번째 클릭이면 반지름 계산하여 원을 그리고 count를 1로 리셋
*************// 컴포넌트의 drawCircle 메소드를 이용!
}
}
public void mouseReleased(MouseEvent event) {}// 아무 일도 하지 않음
public void mouseClicked(MouseEvent event) {}// 아무 일도 하지 않음
public void mouseEntered(MouseEvent event) {}// 아무 일도 하지 않음
public void mouseExited(MouseEvent event) {}// 아무 일도 하지 않음
private CircleComponent component;
private int clickCount=1;
}
public class CircleComponent extends JComponent{
CircleComponent(){
setPreferredSize(new Dimension(400, 400));
ellipse = new Ellipse2D.Double();// 크기가 0인 원을 하나 만들어 저장
// 이것이 없으면 프로그램 시동시 처음 화면이 그려질 때 오류 발생!
}
public void setCenterPosition(int x, int y){
****************
}
public void drawCircle(int x, int y){
double radius = Math.sqrt(
Math.pow((double)(centerX - x), 2.0) +
Math.pow((double)(centerY - y), 2.0)
);// 반지름 계산: (centerX, centerY)와 (x, y) 사이의 거리
ellipse = new Ellipse2D.Double(*****************);
********// 그림이 새로이 그려지게 함, paintComponent 메소드가 실행되게 함
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
*********// 컴포넌트에 원을 그림
}
private Ellipse2D.Double ellipse;
private int centerX;
private int centerY;
}