2012-08-22 54 views
4

我有繪製橢圓形的mouseClick事件表單。這對我來說很好。圈子被繪。但是,當我最小化窗體並再次最大化面板刷新和刪除圓(即面板被留空)。JPanel設計問題

代碼是: 我有一個JFrame上有一個名爲jPanel1的Jpanel,在這個面板上繪製了圓。

private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) { 
     count += 1; 
     if (count <= clients) { 
      drawCircle(evt.getX() - (radius/2), evt.getY() - (radius/2)); 
     } 
    } 

    public void drawCircle(int x, int y) { 
     Graphics g = jPanel1.getGraphics(); 
     g.drawOval(x - radius, y - radius, 2 * radius, 2 * radius); 
     g.setColor(Color.BLACK); 
     g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius); 
    } 
+1

所有歸結爲_not_ use getGraphics()(正如已經在答案中提到的,重複只是爲了強調:)。 – kleopatra

回答

7

在這種情況下,重寫JPanel的paintComponent方法非常重要,但您還需要存儲關於要繪製的圓的信息。在paintComponent呼叫期間,您可以使用該存儲的信息在屏幕上繪製所有圓圈。

import java.awt.*; 
import java.awt.event.*; 
import java.util.ArrayList; 

import javax.swing.*; 



public class TempProject extends JPanel{ 
    /** Stores info about circles */ 
    public ArrayList<CircleInfo> circles = new ArrayList<CircleInfo>(); 

    /** fields that were in example code */ 
    public int count = 0; 
    public final int radius = 20; 
    public final int clients = 20; 

    public TempProject(){ 

     addMouseListener(new MouseAdapter(){ 

      @Override 
      public void mouseClicked(MouseEvent evt) { 
       count += 1; 
       if (count <= clients) { 
         // Store info about the circle to draw 
        circles.add(new CircleInfo(evt.getX() - (radius/2), evt.getY() - (radius/2), radius)); 
         // Tell swing to repaint asap 
        repaint(); 
       } 
      }}); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      //Iterates through saved circles and paints them 
     for(CircleInfo circle : circles){ 
      g.drawOval(circle.x - circle.radius, circle.y - circle.radius, 2 * circle.radius, 2 * circle.radius); 
      g.setColor(Color.BLACK); 
      g.fillOval(circle.x - circle.radius, circle.y - circle.radius, 2 * circle.radius, 2 * circle.radius); 
     } 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setContentPane(new TempProject()); 
       frame.setPreferredSize(new Dimension(400, 300)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    /** Simple class for storing Circle info */ 
    public static class CircleInfo{ 
     int x = 0; 
     int y = 0; 
     int radius = 0; 

     public CircleInfo(int x, int y, int radius){ 
      this.x = x; this.y = y; this.radius = radius; 
     } 
    } 

} 
+1

很棒的回答。 :) –

+0

@AndrewThompson我忘了添加'super.paintComponent',直到我看到你對另一個答案的評論:P哎呀!謝謝你讓我誠實! –

+0

很高興我可以幫忙,如果只是以小的方式。 –

2

所有的圖紙必須在面板的塗裝方法中完成。因此,您必須在面板中覆蓋此方法並將繪圖代碼放在那裏

+0

當然你的意思是_paintComponent_(不畫):-) – kleopatra

3

您不必在JPanelpaintComponent方法之外明確調用繪圖函數。

而應該延伸JPanel並把drawCircle代碼中paintComponent方法:

public class DrawCircleClass extends JPanel 
{ 
    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawOval(x - radius, y - radius, 2 * radius, 2 * radius); 
     g.setColor(Color.BLACK); 
     g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius); 
    } 

} 

鞦韆會自動調用paintComponent方法時組件時,應重繪(ES之後最大化最小化的窗口。)。

+0

當我點擊繪製第二個圓時第一個圓是不可見的。 jPanel重新設計。 – Azuu

+0

得到了解決方案..我在paintComponent()方法寫這super.PaintComponent()方法,這就是爲什麼它得到重新設計。 – Azuu

+0

重要的是要注意,如果你不保存你的圈子信息並重新繪製,你仍然會在調整大小時丟失圈子(請參閱我的答案中的示例)。不過你可能已經解決了這個問題。 –