그림판 문제를 하고 있는데요.
조회수 5711회
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
댓글 입력