2014-10-01 24 views
0

我創建了一個程序,該程序應該在每次單擊(隨機大小和隨機顏色)時繪製一個圓,並且每個圓都將成爲一個對象。我不知道發生了什麼,但我的代碼不起作用,我很確定我幾乎在那裏。用對象重繪我的面板

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.Random; 

public class Circle 
{ 

    private JFrame frame; 
    CircleObj circleObj; 
    Random rand; 
    int rColor; 
    int gColor; 
    int bColor; 
    int radius; 



    public static void main (String [] arg) 
     { 

     frame = new JFrame("Circles"); 
     frame.setBounds(200, 100, 600, 480); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new BorderLayout()); 
     JPanel top = new JPanel(); 
     rand = new Random(); 

     top.addMouseListener(new MouseAdapter() 
     { 
      public void mouseClicked(MouseEvent e) 
       { 
       int xstart = e.getX(); 
       int ystart = e.getY(); 
       rColor = rand.nextInt(256); 
       gColor = rand.nextInt(256); 
       bColor = rand.nextInt(256); 
       radius = rand.nextInt(20); 
       circleObj = new CircleObj(xstart, ystart, rColor, gColor, bColor, radius); 

       repaint(); 

       } 
     }); 
       frame.add(top, BorderLayout.CENTER); 
       frame.setVisible(true); 

     } 


} 

,這裏是我的CircleObj類

import javax.swing.*; 
import java.awt.*; 

public class CircleObj extends JPanel 

{ 
    private int xVal; 
    private int yVal; 
    private int red; 
    private int green; 
    private int blue; 
    private int circleRadius; 


    public CircleObj (int x, int y, int r, int g, int b, int rad) 
     { 
     xVal = x; 
     yVal = y; 
     red = r; 
     green= g; 
     blue = b; 
     circleRadius = rad; 

     } 



     public void paintComponent (Graphics g) { 
     super.paintComponent(g); 
     g.setColor(new Color(red, green, blue)); 
     g.fillOval(xVal,yVal,circleRadius,circleRadius); 
     } 

} 

回答

2

您添加的MouseListener頂端的JPanel,但是當你添加上面的JPanel到頂層窗口,圖形用戶界面? ---在MouseListener!所以這將永遠不會工作,因爲最初的JPanel最初不是GUI的一部分,並且只有在添加到它的MouseListener被觸發時才被添加。 MouseListener僅適用於可見和GUI上的組件。

接下來創建一個CircleObj對象,但從不在任何JComponent或JPanel的paiintComponent方法中繪製它。

我很確定我快到了。

所以不,不是。您將要重新開始和:

  • 創建有一個體面的paintComopnent方法重寫一個JPanel,
  • 此JPanel到JFrame從一開始添加到GUI
  • 添加ArrayList<CircleObj>本圖的JPanel
  • 更改您的CircleObj類,以便它不擴展JPanel,但確實有public void draw(Grpahics g)方法,將繪製。
  • 將MouseListener添加到控制此繪圖的JPanel。在您的MouseListener中,將新的CircleObj添加到ArrayList中,並調用repaint()以獲取繪製JPanel的繪製。
  • 在JPanel的paintComponent覆蓋中,遍歷調用每個對象的draw(g)方法的ArrayList<CircleObj>
  • 閱讀Swing graphics tutorials
+0

@ iali87由於這個答案顯示,有大量的工作要做。我建議把它分解成小塊。例如,您可能想要先在JPanel上繪製**一個**圓圈。圓的位置和大小應該先硬編碼,以保持容易。實際上,在沒有** CircleObj類的情況下繪製一個圓**,然後在以後添加它。從那裏添加一些更復雜的東西。一次添加一點點,直到完成項目。 – 2014-10-01 04:49:35

+0

@Hovercraft全部的鰻魚首先謝謝你...我根據你的建議創建了代碼......我不確定如何將每個點擊的顏色存儲到對象的ArrayList中。 – iali87 2014-10-01 05:04:55

+0

@ iali87:您需要在MouseListener中執行此操作。你甚至可以給JPanel繪圖一個方法 - 「addCircle(Point p)」,並在其中讓繪圖面板從鼠標點創建一個新的Circle,然後從MouseListener中調用該方法。堅持下去,你就會得到它,但是不要猜測並且不要在第一次思考邏輯時拋出代碼,否則你最終會得到上面發佈的代碼。 – 2014-10-01 05:09:00

2

這裏是第二種方法...我將如何能夠調整它存儲在一個對象(Arraylist對象)的每個圓圈?

public class Circle { 
     public static void main (String[] arg) { 
     JFrame frame = new JFrame("Circles"); 
     CircleObj canvas = new CircleObj(); 

     frame.add(canvas, BorderLayout.CENTER); 
     frame.setBounds(250, 98, 600, 480); 
     //frame.setLayout(new BorderLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     } // end main 
    } //end Circle 

CircleObj類

public class CircleObj extends JPanel { 
    private int rColor; 
    private int gColor; 
    private int bColor; 
    private int radius; 
    private Random rand = new Random(); 
    private int xStart; 
    private int yStart; 

    public CircleObj() { 
    addMouseListener(new MouseAdapter() { 

     public void mouseClicked (MouseEvent e) { 

     xStart = e.getX(); 
     yStart = e.getY(); 
     rColor = rand.nextInt(256); 
     gColor = rand.nextInt(256); 
     bColor = rand.nextInt(256); 
     radius = rand.nextInt(20); 
     System.out.println("xstart : " + xStart + ", ystart : " + yStart + ", rColor : " + rColor + ", gColor = " + 
       gColor + ", bColor: " + bColor + ", radius: " + radius); 

     repaint(); 
     } 
    }); // end addMouseListener 
    } 

    public void paintComponent (Graphics g) { 
    super.paintComponent(g); 
    g.setColor(new Color(rColor, gColor, bColor)); 
    g.fillOval(xStart, yStart, radius, radius); 
    } 

}