2013-10-24 46 views
0

我試圖在我的JPanel中畫圖,但每次點擊時,我的JPanel背景都消失了。它在鼠標所在的位置繪製一條線。我認爲它與2D圖形有關 有人可以幫忙嗎?Swing - JPanel背景顏色消失

public Brush() { 

addMouseListener(this); 
    addMouseMotionListener(this); 
    setBackground(Color.white); 


} 
    @Override 
    public void paintComponent(Graphics g) { 

     Graphics2D g2; 
     // super.paintComponent(g); 

     g2 = (Graphics2D) g; 

     g2.setColor(brushColor); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL)); 
     //Ellipse2D.Double circle = new Ellipse2D.Double(p1.x,p1.y,20,20); 

     g2.fillOval(p1.x,p1.y,20,20); 

     } 


     @Override 
     public void mousePressed(MouseEvent e) { 
      dragging = true; 
      p1 = e.getPoint(); 
      repaint(); 
     } 
     @Override 
     public void mouseReleased(MouseEvent e) { 
      dragging = false; 
      p1 = e.getPoint(); 
      repaint(); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      if (dragging) { 
       p1 = e.getPoint(); 
       repaint(); 
      } 
     } 

回答

4

在覆寫中始終調用super.paintComponent(g)方法。

你畫錯了。如果你想畫一堆橢圓形的,那麼無論

  • 創建它們的集合,具有吸引他們在的paintComponent循環,或
  • 吸引他們一個BufferedImage,然後在你的paintComponent方法繪製。
  • 如果我想用鼠標繪製一條曲線,我通常會創建一個ArrayList<Point>並在連續的點之間畫線,無論是在paintComponent中還是在BufferedImage中。

同樣,你的代碼被寫入畫中的paintComponent 只有一個點(橢圓實際上)。如果編碼正確,這就是它所要做的。

我建議,最容易做的事情是:

  • 給你一流的ArrayList<Point>
  • 當按下鼠標加入點和調用重繪
  • paintComponent,調用超級方法,然後使用for循環遍歷ArrayList。
  • 在項目1的點開始循環,而不是0,然後在前一個點和當前點之間繪製一條線。
  • 爲了讓您更有魅力,您可能希望有一個ArrayList<ArrayList<Point>>,您可以在每次按下鼠標時開始一個新的ArrayList<Point>,在每個版本中完成並將其添加到整個集合中。這將允許繪製多條線。

爲什麼不先把這個放在你自己的位置上呢?

+0

但是當我這樣做時,畫橢圓消失? –

+0

@RafVandelaer:你畫錯了。請參閱編輯。 –

+0

我不明白,你有沒有例子? 我也希望直接繪製點,所以不是在你釋放鼠標按鈕後才能繪製。 –