2010-01-15 92 views
1

這裏是我的代碼:繪製多個矩形與Java(AWT)

class Ramka extends JFrame 
    { 
    public static final int SZEROKOSC = 800; 
    public static final int WYSOKOSC = 600; 
    Container powZawartosci = getContentPane(); 
    public Ramka() 
     { 
     setSize(SZEROKOSC, WYSOKOSC); 
     setTitle("Siatka bryły by Paweł Mysior"); 
     } 
    public void addRectangle(int startX, int startY, int sizeX) 
     { 
     drawRectangle rect = new drawRectangle(startX, startY, sizeX); 
     powZawartosci.add(rect); 
     } 

class drawRectangle extends JPanel 
    { 
    private int a, startX, startY; 
    public drawRectangle(int startX, int startY, int a) // square 
     { 
     this.a = a; 
     this.startX = startX; 
     this.startY = startY; 
     } 
    public void paintComponent(Graphics g) 
     { 
     Rectangle2D rect = new Rectangle2D.Double(startX, startY, a, a); 
     Graphics2D g1 = (Graphics2D) g; 
     g1.draw(rect); 
     } 
    } 

public class Main 
    { 
    public static void main(String[] args) 
     { 
     Ramka ramka = new Ramka(); 
     ramka.addRectangle(200, 200, 50); 
     ramka.addRectangle(100, 100, 100); 
     ramka.addRectangle(300, 300, 150); 
     ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ramka.setVisible(true); 
     } 
    } 

我希望它做的是畫出三個矩形(劃出這樣的功能和意義是什麼,我還只是學習)。

但它提請只有最後一個,起始於300和300。我真的不明白的paintComponent的事...

在此先感謝您的幫助, 保羅

回答

1

我beleive那您將相互重疊添加三個JPanel。這看起來像是一種奇怪的繪製矩形的方式,但使用這種設計,您需要使用LayoutManager

檢出this鏈接,並嘗試學習。下面的代碼應該可以做到這一點。

... 
Container powZawartosci = getContentPane(); 
public Ramka() 
    { 
    setSize(SZEROKOSC, WYSOKOSC); 
    setTitle("Siatka bryły by Paweł Mysior"); 
    setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));//Only this line is inserted. 
    } 
public void addRectangle(int startX, int startY, int sizeX) 
    { 
    drawRectangle rect = new drawRectangle(startX, startY, sizeX); 
    powZawartosci.add(rect); 
    } 
... 

在你JPanel衍生,你可以跟蹤你需要繪製Rectangle S的。我自發地寫下了代碼,所以首先檢查錯誤。

class RectangleDrawer extends JPanel{ 
    ArrayList<Rectangle> rList = new ArrayList()<Rectangle>; 
    public void addRectangle(Rectangle rect){ 
     rList.add(rect); 
    } 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     for(int i=0; i<rList.size(); r++){ 
      g.drawRectangle(rList.get(i)); 
     } 
    } 
} 
+0

權,可以說,我只是想畫這三個矩形,不一定的JPanel,會是什麼你推薦呢?我可以在一個JPanel中繪製三個矩形嗎? – PawelMysior

+0

是的,你可以在一個JPanel上繪製任何東西。我將編輯我的帖子以更好地解釋。 –

1

問題的根本在於你在這裏使用兩個不同的抽象層次。

在第一個,你正在添加一個組件到你的JFrame,這在某些時候是很好的。

您正在添加「DrawRectangle」實例,就像添加新按鈕,標籤或其他面板一樣。當你在相同的位置添加組件時,問題就來了。如果不添加任何約束,JFrame的主面板(內容窗格)將使用"Border" layout manager,該組件位於中間。

爲方便起見,BorderLayout的解釋不存在字符串說明書的相同恆定CENTER

alt text http://java.sun.com/javase/6/docs/api/java/awt/doc-files/BorderLayout-1.gif

所以,這一行:

powZawartosci.add(rect); 

始終將您的組件添加到「中心」中,覆蓋之前的組件。這就是爲什麼你只看到一個矩形。

這裏使用的抽象的第二層是自己繪製組件。這是低級別的,你必須告訴組件誰來繪製每一行和哪裏。

這很好,但是如果您想在同一個組件中繪製幾個矩形,則必須爲每個組件保存引用(使用類似列表的集合),然後迭代該集合並將它們全部繪製。

像這樣:

many http://img40.imageshack.us/img40/8125/capturadepantalla201001nd.png

我把你的代碼,並改變了它,以反映我在說什麼。最終的結果使用相同的組件,但是這個組件反過來繪製所有的矩形。

還要注意命名/支柱的風格,而不是強制性的,通常在編程中的Java

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

class Ramka extends JFrame { 
    public static final int SZEROKOSC = 800; 
    public static final int WYSOKOSC = 600; 
    Container powZawartosci = getContentPane(); 
    DrawRectangle rectangle = new DrawRectangle(); 
    public Ramka() { 
     setSize(SZEROKOSC, WYSOKOSC); 
     setTitle("Siatka bryły by Paweł Mysior"); 
     powZawartosci.add(new JLabel("Several rectangles are being displayed"), BorderLayout.NORTH); 
     powZawartosci.add(rectangle); 
    } 
    public void addRectangle(int startX, int startY, int sizeX) { 
     this.rectangle.addRectangle(startY, startY, sizeX); 
    } 

} 

class DrawRectangle extends JPanel { 
    private java.util.List<Rectangle2D> squares; 
    //private int a, startX, startY; 
    public DrawRectangle(){ 
     squares = new ArrayList<Rectangle2D>(); 
    } 

    public void addRectangle(int startX, int startY, int a) { // square 
     squares.add(new Rectangle2D.Double(startX, startY, a, a)) ; 
     //this.a = a; 
     //this.startX = startX; 
     //this.startY = startY; 
    } 
    public void paintComponent(Graphics g) { 
     Graphics2D g1 = (Graphics2D) g; 
     for(Rectangle2D rect : squares) { 
      g1.draw(rect); 
     } 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     Ramka ramka = new Ramka(); 
     //ramka.addRectangle(200, 200, 50); 
     //ramka.addRectangle(100, 100, 100); 
     //ramka.addRectangle(300, 300, 150); 
     for(int i = 0 ; i < 20 ; i++){ 
      ramka.addRectangle(i * 10 , i * 10 , i * 20); 
     } 
     ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ramka.setVisible(true); 
    } 
} 
+0

謝謝,我想我知道我做錯了什麼。再次感謝 ;] – PawelMysior