import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Study1117_3 extends Frame{
private MyCanvas mc;
private MenuPanel pane;
private Pen p;// 각 다른 클래스들 선언
public Study1117_3(){
super("도형그리기-화이트보드");
p = new Pen();
mc = new MyCanvas(p);
pane = new MenuPanel(p,mc);//객체를 생성해주고 펜객체를 사용하기위해
// 각객체에 p를 인수로 전달한다.
// 메뉴패널에는 다지우기버튼을 위한 캔버스객체까지 전달.
setSize(800,600);
add(pane,"West");
add(mc,"Center");
setVisible(true);
}
public static void main (String args[]){
Study1117_3 obj = new Study1117_3();
}
}
class Pen{
private int type = 0;
public void setType(int type){
this.type = type;
}
public int getType(){
return type;
}
}//버튼을 어떤버튼을 눌럿는지 버튼에 맞는 번호를 저장하고, 반환.
class MenuPanel extends Panel{
private Pen p;
private MyCanvas mc;
public MenuPanel(Pen p, MyCanvas mc){
super(new GridLayout(8,1));
this.p = p;
this.mc = mc;
Button b1 = new Button("사각형");
Button b2 = new Button("삼각형");
Button b3 = new Button("둥근사각형");
Button b4 = new Button("동그라미");
Button b5 = new Button("부채꼴");
Button b6 = new Button("직선");
Button b7 = new Button("지우기");
Button b8 = new Button("모두 지우기");//버튼생성.
MenuListener ml = new MenuListener(p, mc);//리스너객체생성인수로 Pen객체 전달.
//또한, 다지우기를 해야하므로
//MyCanvas 객체까지 같이 전달.
b1.addActionListener(ml);
b2.addActionListener(ml);
b3.addActionListener(ml);
b4.addActionListener(ml);
b5.addActionListener(ml);
b6.addActionListener(ml);
b7.addActionListener(ml);
b8.addActionListener(ml);//각버튼에 액션리스너 add
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
add(b6);
add(b7);
add(b8);//패널에 버튼 삽입.
}
}
class MenuListener implements ActionListener{
private Pen p;
private MyCanvas mc;
public MenuListener(Pen p, MyCanvas mc){
this.p = p;
this.mc = mc;//인수로 전달된 Pen 객체 저장.
}
public void actionPerformed(ActionEvent e){
String str = e.getActionCommand();
if ("사각형".equals(e.getActionCommand())){
p.setType(1);
}
else if ("삼각형".equals(e.getActionCommand())){
p.setType(2);
}
else if ("둥근사각형".equals(e.getActionCommand())){
p.setType(3);
}
else if ("동그라미".equals(e.getActionCommand())){
p.setType(4);
}
else if ("부채꼴".equals(e.getActionCommand())){
p.setType(5);
}
else if ("직선".equals(e.getActionCommand())){
p.setType(6);
}
else if ("지우기".equals(e.getActionCommand())){
p.setType(7);
}
//각 도형에 맞는 번호를 인수로 Pen객체에 전달.
else if ("모두 지우기".equals(e.getActionCommand())){
Graphics g = mc.getGraphics();
g.clearRect(0,0,mc.getWidth(),mc.getHeight());
}//my를 이용하여 전체화면을 클리어.
}
}
class MyCanvas extends Canvas{
private Pen p;
private int xp, yp, xr, yr;
private int lx, ly, dwid, dhei, sx, sy;
public MyCanvas(Pen p){
this.p = p;
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
xp = e.getX();
yp = e.getY();//클릭할때의 좌표점 저장.
}
public void mouseReleased(MouseEvent e){
xr = e.getX();
yr = e.getY();//땔때의 좌표점 저장.
draw();//마우스버튼을 땟을때 바로 도형이 생기기 위해.
}
});
}
public void paint(Graphics g){
}//도형을 그리고 백터에 저장하는 메서드가 있다면
//여기서 그 백터의 정보를 불러와서
//화면이 줄거나 커지거나 하는 캔버스 크기의 변화가 생겨도
//도형이 계속 남아있을수 있다.
public void draw(){
Graphics g = getGraphics();
if(xp > xr){
dwid = xp - xr;
lx = xp;
sx = xr;
}
else if(xp < xr){
dwid = xr - xp;
lx = xr;
sx = xp;
}
else if(xp == xr){
dwid = 0;
lx = xp;
sx = xp;
}
if(yp > yr){
dhei = yp - yr;
ly = yp;
sy = yr;
}
else if(yp < yr){
dhei = yr - yp;
ly = yr;
sy = yp;
}
else if(yp == yr){
dhei = 0;
ly = yp;
sy = yp;
}//각좌표점이 항상 먼저 찍히는 쪽이 좌측 위가 아니므로,
//그것을 대비한 좌표점 저장을 위해 도형이 그려질 좌표점 지정.
switch(p.getType()){
case 1:
g.drawRect(sx, sy, dwid, dhei);
break;
case 2:
int[] xpos = {sx, (xp+xr)/2, lx};
int[] ypos = {ly, sy, ly};
g.drawPolygon(xpos, ypos, 3);
break;
case 3:
g.drawRoundRect(sx,sy,dwid,dhei,5,10);
break;
case 4:
g.drawOval(sx,sy,dwid,dhei);
break;
case 5:
g.fillArc(sx,sy,lx,ly,0,160);
break;
case 6:
g.drawLine(sx,sy,lx,ly);
break;
case 7:
g.clearRect(sx,sy,lx,ly);
break;
}//각 버튼이 눌려질때 Pen 객체에 저장된 번호를 보고
// 그 번호에 맞도록 도형이 그려지겠금 스위치문 사용.
//발전방향 - 이다음에 벡터에 방금 그린 도형의 정보를 저장하여
// paint 메서드에서 그 벡터 정보를 읽어와 다시 그려주는 혹은
// 그 횟수에 맞도록 루프를 돌리는 이것과 같은 메서드를 한개더 만들어
// 캔버스의 크기조절에도 대처할수 있도록 하는 것이 필요.
-------------------------------------------------------------------
프로젝트 관련된것 프로젝트 제출일 전으로 올리도록 하겠습니다.
제가 잘 하지 못해서 친구한테 배워가면서 구현해야 해서 시간이 조금 오래 걸립니다.
죄송합니다. 열심히 가르쳐 주시는데 제가 잘 알아듣지를 못해서요~ㅠㅠ
교수님 그리고 파트너 친구가 취업관계로 퇴근 시간이 너무 늦는 바람에
발표는 참여 못할수도 있다고 합니다. 시험에만 회사를 비울수 있다고 해서요..
이 경우는 어찌 해야 하나요?