그림판 문제를 하고 있는데요.

조회수 5705회

캔버스 그림판.

Canvas 객체를 공부하고 있는데요. 그림판문제가 있어서 한 번 만들어 봤습니다.

그런데 아무리 해도 지우기와 모두 지우기가 되지않고 원래 그리던 색으로 칠해집니다.

actionPerformed안에 있는

  if(obj==erase){
                    cd.color = cd.getBackground();
                }else if(obj==eraseAll){
                    cd.sw=1;
                    cd.repaint();

이게 문제인듯하여 Color객체를 생성하여 수정하여봐도 안됩니다. 에러나 경고창은 뜨지않아 문법상에 문제가 있는것같지는 않은데 도저히 지워지지않아 이렇게 질문드리게 되었습니다.

감사합니다. 좋은 하루되세요~

package Graphics;
import java.awt.*;
import java.awt.event.*;



    public class paintSampleEx extends Frame {
        Panel pLeft, p1, p2, pRight;
        Button blue, orange, green, plus, minus, erase, eraseAll;
        CanvasDemo cd;


        public paintSampleEx() {
        super("paint Application Test");
        pLeft = new Panel(new BorderLayout());
        pLeft.setBackground(Color.lightGray);
        add(pLeft,"West");

        p1 = new Panel(new GridLayout(3,1)){
            public Insets getInsets(){
                return new Insets(10, 10, 10, 10); //여백
            }
        };

        pLeft.add(p1,"North");

        // p1 버튼 생성
        blue = new Button();
        blue.setBackground(Color.blue);
        orange = new Button();
        orange.setBackground(Color.orange);
        green = new Button();
        green.setBackground(Color.green);

        p1.add(blue); p1.add(orange); p1.add(green);

        // p2 버튼 생성
        plus = new Button("+");
        minus = new Button("-");
        erase = new Button("지우기");
        eraseAll = new Button("모두 지우기");



        p2 = new Panel(new GridLayout(4,1)){
            public Insets getInsets(){
                return new Insets(20, 10, 220, 10);
            }
        };

        p2.add(plus); p2.add(minus); p2.add(erase); p2.add(eraseAll);

        pLeft.add(p2, "Center");

        pRight = new Panel(){
            public Insets getInsets(){
                return new Insets(70, 20, 20, 20);
            }
        };

        pRight.setBackground(Color.gray);
        add(pRight, "Center");

        cd = new CanvasDemo();
        cd.setSize(300, 300);
        pRight.add(cd);
        cd.setBackground(Color.WHITE);

        blue.addActionListener(new EventHandler());
        orange.addActionListener(new EventHandler());
        green.addActionListener(new EventHandler());
        plus.addActionListener(new EventHandler());
        green.addActionListener(new EventHandler());
        minus.addActionListener(new EventHandler());
        erase.addMouseMotionListener(new EventHandler());   
        eraseAll.addMouseMotionListener(new EventHandler());        
        cd.addMouseMotionListener(new EventHandler());


        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we){
                System.exit(0);
            }
        });

    } // end of paintSampleEx() 생성자

        class EventHandler extends MouseMotionAdapter implements ActionListener{
            public void mouseDragged(MouseEvent me){
                cd.x = me.getX();
                cd.y = me.getY();
                cd.repaint();
            }

            public void actionPerformed(ActionEvent ae) {
                Object obj = ae.getSource();
                Color btnCol= ((Button)obj).getBackground(); 
                //System.out.println(btnCol);
                cd.sw= 0;

                if(btnCol==Color.blue){
                    cd.color = btnCol;
                }else if(btnCol==Color.orange){
                    cd.color = btnCol;
                }else if(btnCol==Color.green){
                    cd.color = btnCol;
                }else if(obj==plus){ // 크기 조정
                    cd.w++; cd.h++;
                }else if(obj==minus){
                    if(cd.w > 3){ // 최소값 설정
                    cd.w--; cd.h--;
                    }
                }else if(obj==erase){
                    cd.color = cd.getBackground();
                }else if(obj==eraseAll){
                    cd.sw=1;
                    cd.repaint();
                }
            }
        }

    public static void main(String[] args) {
        paintSampleEx ps = new paintSampleEx();
        ps.setBounds(300,100,600,500);
        ps.setVisible(true);
    }

    }



class CanvasDemo extends Canvas{
    int x= -10, y= -10, w=10, h=10;
    int sw= 0;
    Color color = Color.blue;

    public void update(Graphics g){
        paint(g);
    }

    public void paint(Graphics g){
        if(sw == 0){
        g.setColor(color);
        g.fillOval(x, y, w, h); // 원 출력
        }else if(sw == 1){
            g.clearRect(0, 0, 300, 300);
        }
    }
}
  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 지우기와 모두 지우기 버튼이 눌려도 ActionListener가 실행되지 않고 있었습니다.

    이런 경우 아래와 같이 출력문을 넣어서 버튼이 눌리는걸 인식하고 있는지 확인해 보는게 좋습니다.

    }else if(obj==erase){
        System.out.println("Erase");
        cd.color = cd.getBackground();
    }
    

    아래와 같은 코드가 있는 부분을 찾아서 addMouseMotionListener를 addActionListener로 변경하면 정상 동작합니다.

    erase.addMouseMotionListener(new EventHandler());   
    eraseAll.addMouseMotionListener(new EventHandler());        
    
    • 그런데 awt에 대해 찾다보니 너무 낡은 기술이라 이걸 배우는걸 다들 비추하네요. 정토드 2016.5.5 16:41
    • 와 Listener에서 틀렸구나... 일일이 치기보다는 ctrl+space누르고 자동완성으로 소스를 작성하다보니 이런 곳에서 틀리네요. 저는 계속 제가 일일이 작성한 곳을 중점으로 찾아봤는데... 조금더 세심히 보도록 노력하겠습니다... 그럼 awt는 간단히 보고 넘어가야겠네요~ 답변감사합니다!! 알 수 없는 사용자 2016.5.6 12:07

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)