2011-03-11 2 views
3

자바의 간단한 페인트 패드에 문제가 있습니다. 취소 버튼을 다시 그리는 데 문제가 있습니다. 배열이 지워지고 있지만 다시 칠하지 못합니다. 아무도 내 문제를 발견하거나이 코드에 대한 명확한 버튼을 생성하는 다른 방법이있을 수 있습니다.자바 그래픽 다시 칠 문제

public class DrawingPanel extends JPanel { 
    private double x1=0; 
    private double x2=0; 
    private double y1=0; 
    private double y2=0; 

    private ArrayList<Shape> myArr = new ArrayList<Shape>(); 
    //private ArrayList<Shape> clearMyArr = new ArrayList<Shape>(); 
    ButtonPanel buttonPress; 

    public void paintComponent(Graphics g) 
    { 
    for (Shape i : myArr) 
    { 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.draw(i); 
    } 
     /*for (Shape i : clearMyArr) 
    { 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.draw(i); 
    } */ 

    }   
    //inner class 

    class Listener1 extends MouseAdapter 
    { 
     public void mousePressed(MouseEvent e) 
    { 
     x1=e.getX(); 
     y1=e.getY(); 
     System.out.println("Mouse Pressed"); 
    } 

     public void mouseReleased(MouseEvent e) 
    { 
     x2=e.getX(); 
     y2=e.getY(); 
     Shape shape = null; 
     if (buttonPress.buttonType.equals("Rectangle")) 
     { 
     // Rectangles cannot have a zero width or height 
      if (x1 != x2 || y1 != y2) 
      { 
       double width = Math.abs(x1 -x2); 
       double height = Math.abs(y1-y2); 
       shape = new Rectangle2D.Double(Math.min(x1,x2),Math.min(y1,y2), width, height); 
      } 
     } 
     if (buttonPress.buttonType.equals("Eclipse")) 
     { 
      double width = Math.abs(x1 -x2); 
      double height = Math.abs(y1-y2); 
      shape = new Ellipse2D.Double(Math.min(x1,x2),Math.min(y1,y2), width, height);; 
     } 
     if (buttonPress.buttonType.equals("Lines")) 
     { 
      shape = new Line2D.Double(x1, y1, x2, y2); 

     } 
      if (buttonPress.buttonType.equals("Clear")) 
     { 
       for(int i = 0;i <= myArr.size(); i++) 
       { 
       System.out.println("ArrayList Size :"+myArr.size()); 

       myArr.clear(); // clear all elements from arraylist 
       //clearMyArr.addAll(myArr); 
       System.out.println("ArrayList Size :"+myArr.size()); 

       //myArr.removeAll(); 
       revalidate(); 
       repaint(); 
       } 


     } 

     if (shape != null) 
     { 
      myArr.add(shape); 

     } 
     repaint(); 
    } 


    } 
//end of inner class 

    public DrawingPanel(ButtonPanel reference) 
    { 
    buttonPress = reference; 
    setBorder(BorderFactory.createLineBorder(Color.black,4)); 
    addMouseListener(new Listener1());  
    } 

}

+1

나는이 문제를 이해하지 못한다. 삭제 한 후에도 이전 모양이 계속 표시됩니까? 또는 지우기 단추가 그려지지 않았습니까? – Ishtar

+0

더 빨리 도움을 받으려면 SSCCE (http://pscode.org/sscce.html)를 게시하십시오. –

답변

6

super.paintComponent(g);을 잊어 버리면 배경이 지워지지 않으므로 오래된 이미지가 계속 표시됩니다. 그리고 당신이 추가 한 모든 JButton의 것들은 그려지지 않을 것입니다. 이 문제를 해결하려면 패널이 먼저 그려 지도록하고 그 위에 물건을 그릴 수 있습니다.

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g);// <-- let panel draw itself 
    Graphics2D g2d = (Graphics2D)g; 
    for (Shape i : myArr) 
    { 
     g2d.draw(i); 
    } 
    } 

이 (당신이 DrawingPanel.add(..)에 추가 위젯을 그리지 않는다는 점을 제외)도 작동합니다. 더러운 해킹입니다.

@Override 
protected void paintComponent(Graphics g) 
    Graphics2D g2d = (Graphics2D)g; 
    g2d.setColor(Color.grey); 
    g2d.fillRect(0,0,this.getWidth(),this.getHeight()); //<-- clear the background 
    for (Shape i : myArr) 
    { 
     g2d.draw(i); 
    } 
    } 

청취자의 경우이 정도면 충분합니다.

if (buttonPress.buttonType.equals("Clear")) 
{ 
    myArr.clear(); 
    repaint(); 
} 

revalidate();으로 전화하지 않아도됩니다.

+0

선생님 천재 야, 정말 고마워. :) – mix2000

1

TRY) (칠 호출; JPanel의

+0

지우기 단추를 누르면 그려진 도형의 배열이 지워지지만 jpanel에서 지워지지는 않습니다. 나는 hvalid revalidate(), repaint()를 시도했지만 아무 소용이 없다. – mix2000

1

paintcomponent 메소드에서 super.paintcomponent (g)를 호출 해보십시오. 또한 JPanel의 revalidate 및 repaint 메소드를 호출하는지 확인하십시오.