2014-02-18 35 views
2

我有這個簡單的塗料代碼應該繪製,但它會移動面板周圍的橢圓。 當我刪除super.paintComponent(g)行時,程序運行它的油漆,而不僅僅是移動橢圓形,但我一直在閱讀,我們不應該刪除這條線,所以我可以做些什麼離開線,但仍然得到所需的結果?Java簡單的塗料代碼不起作用

class OraclePaint extends JFrame { 
    public static void main(String[] args) { 
     OraclePaint ss = new OraclePaint(); 
     ss.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ss.add(new MyPanel()); 
     ss.setSize(250, 200); 
     ss.setVisible(true); 
    } 
} 

class MyPanel extends JPanel { 
    private int x = -10, y = -10; 

    public MyPanel() { 
     addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseDragged(MouseEvent event) { 
       x = event.getX(); 
       y = event.getY(); 
       repaint(); 
      } 
     }); // end call to addMouseMotionListener 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.fillOval(x, y, 22, 22); 
    } 
} 
+0

嘗試使用'x'和'y'座標正值。 – Omoro

+0

謝謝,但它沒有奏效。 –

+0

它會移動它,因爲每次拖動鼠標時都會要求它繪製它。當然你不想鼠標點擊? – arynaq

回答

2

根據描述,我假設你想要類似「一個簡單的繪圖程序」。

調用super.paintComponent(g)作爲重寫的paintComponent的第一行是正確的。這確實會擦除背景(即之前繪製的所有內容都將被刪除)。

在Swing中,一切,你要畫已經在paintComponent方法塗(或在從那裏叫,並接收相同Graphics對象的任何方法)。

如果你想「拯救」你有畫的一切,你必須一切畫成圖像(即進入一個BufferedImage),並在paintComponent方法繪製此圖像。 (!)

沒有與代碼中的一些其他問題,但沒有改變太多剩餘的代碼,這可能大致可以達到這樣的:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

class OraclePaint extends JFrame { 
    public static void main(String[] args) { 
     OraclePaint ss = new OraclePaint(); 
     ss.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ss.add(new MyPanel()); 
     ss.setSize(250, 200); 
     ss.setVisible(true); 
    } 
} 

class MyPanel extends JPanel { 
    private BufferedImage image = null; 

    public MyPanel() { 
     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent event) { 
       if (image != null) { 

        // Paint into the image 
        Graphics g = image.getGraphics(); 
        g.setColor(Color.BLACK); 
        g.fillOval(event.getX(), event.getY(), 22, 22); 
        g.dispose(); 

        repaint(); 
       } 
      } 
     }); // end call to addMouseMotionListener 
    } 

    // Make sure that the image is not 'null' and that 
    // it has the same size as this panel 
    private void validateImage() 
    { 
     if (image == null) 
     { 
      image = new BufferedImage(getWidth(), getHeight(), 
       BufferedImage.TYPE_INT_ARGB); 
     } 
     if (image.getWidth() != getWidth() || image.getHeight() != getHeight()) 
     { 
      BufferedImage newImage = new BufferedImage(getWidth(), getHeight(), 
       BufferedImage.TYPE_INT_ARGB); 
      Graphics g = newImage.getGraphics(); 
      g.drawImage(image, 0, 0, null); 
      g.dispose(); 
      image = newImage; 
     } 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     validateImage(); 
     g.drawImage(image, 0, 0, null); 
    } 
} 
+0

+1對於setColor – mKorbel

0

改變你的MyPanel這樣:

class MyPanel extends JPanel 
{ 
    private int x2 = 0, y2 = 0; 
    private int x1 = 0, y1 = 0; 
    public MyPanel() 
    { 
     addMouseMotionListener(new MouseMotionAdapter() 
     { 
      public void mouseDragged(MouseEvent event) 
      { 
       x2 = event.getX(); 
       y2 = event.getY(); 
       repaint(); 
      } 
     } 
     ); // end call to addMouseMotionListener 

     addMouseListener(new MouseListener() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       x1 = e.getX(); 
       y1 = e.getY(); 
      } 
     }); 

    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.fillOval(x1, y1, x2, y2); 
    } 
}