2017-07-13 163 views
1

我想繪製圓圈到JFrame與不同的位置,在這種情況下在網格狀模式。將多個圓圈添加到JFrame? (Java)

我似乎沒有麻煩畫出一個單一的圓,X,Y的位置,但是,當我試圖繪製多個不同位置的圓圈,其他圓圈的位置被遮蔽。

在下面的代碼中,我有兩個數組:XPlacements和YPlacements,它們包含不同的X和Y位置以形成一個網格。對於每個X位置,應該在該X位置處創建具有變化的Y位置的圓圈(反之亦然)。

當我只讓下面的代碼繪製一個圓圈,其中XPlacements = {10} YPlacements = {100},它會繪製一個看起來像在左上方一些(10,100)的圓。同樣,當我添加多個X位置而只有一個Y位置時,似乎沒有任何東西被遮擋。但是,當我添加多個Y位置時,每個下降的圓圈似乎越來越向右推動。 當我運行它,它掩蓋這樣的:http://imgur.com/HHjhvPD

我似乎無法使它不那麼通過改變JFrame的價值觀模糊。我能找到的所有JFrame圈子教程只處理1個圈子,當我使用1圈(或只有1圈圈子)時,我沒有任何問題。

有誰知道爲什麼下面的代碼不會產生類似於網格的網格?

謝謝。這一切

public class Circle extends Canvas { 
int XPos; 
int YPos; 
public void SetPosition(int x, int y) { 
    this.XPos = x; 
    this.YPos = y; 
    repaint(); 
} 
public void paint(Graphics g) { 
    System.out.println("Filling oval with position ("+XPos+","+YPos+")"); 
    g.fillOval(XPos, YPos, 15, 15); 
} 
} 

public class MainFile extends JFrame { 
static int[] XPlacements = {10,20,30}; 
static int[] YPlacements = {100,200,300}; 
static Circle[] Circles = new Circle[1000]; 
static int Circle_Count = 0; 

public static void main(String[] args) { 
    JFrame frame = new JFrame("Grid of circles"); 
    frame.setLayout(new GridLayout(1,1)); 
    frame.setSize(800, 800); 

    for(int x=0;x<XPlacements.length;x++) { 
     for(int y=0;y<YPlacements.length;y++) { 
      System.out.println("Creating new circle "+Circle_Count+" with position "+XPlacements[x]+","+YPlacements[y]); 
      Circles[Circle_Count] = new Circle(); 
      Circles[Circle_Count].SetPosition(XPlacements[x],YPlacements[y]); 
      frame.add(Circles[Circle_Count]); 
      Circle_Count++; 
     } 
    } 
    frame.setVisible(true); 
} 
} 
+0

嘗試'新的GridLayout(YPlacements.length,XPlacements.length)' – Berger

+0

在這種簡單的情況下使用數組等等的含義是什麼?您可以使用單個組件變量: 它只會有一個意義,如果你需要保持每個添加組件的不同名稱,以便您可以單獨刪除它們中的任何一個... – Apostolos

回答

1

首先是一個JPanel的Swing應用程序使風俗畫應該通過重寫的paintComponent()來完成。 Canvas是一個不應該在Swing應用程序中使用的AWT組件。

如果要繪製組件,則自定義繪畫總是相對於偏移量(0,0)完成。所以你的情況的代碼是:

//g.fillOval(XPos, YPos, 15, 15); 
g.fillOval(0, 0, 15, 15); 

然後,你需要重寫你的類的getPreferredSize()方法來設置組件的大小:

@Override 
public Dimension getPreferredSize() 
{ 
    return new Dimension(15, 15); 
} 

閱讀從Swing節教程Custom Painting欲瞭解更多信息和工作示例。

現在佈局管理有關組件的信息,可以在面板上放置的每個組件:

因此,代碼爲圓添加到框架會是這樣的:

frame.setLayout(new GridLayout(3, 3, 50, 50)); 

for (int i = 0; i < 9; i++) 
{ 
    frame.add(new Circle()); 
} 

這將在每個組件之間創建一個間隔爲50像素的3x3網格。