2013-11-09 23 views
1

UPDATE 19/01/14(對於像這樣的問題的人) 我所描述的問題起源於我的circle類擴展了JPanel的事實。所以我從這個班級創建的每個圈子其實都是它自己的面板。因此,通過添加布局,我可以看到兩個圓圈。現在我瞭解到,它的Wiser有一個擴展JPanel的單獨的「板級」,在這種情況下讓這個圈子什麼都沒有擴展。這樣我就可以在circleclass中實現一個drawMySelf方法,並將它們繪製在我的棋盤上。這樣我可以在同一個面板中有各種幾何對象!:) UPDATE END。瞭解paintComponent

即時進行一項任務,我需要繪製兩個圓圈。當我調整幀大小時,這些圈子應該隨機重新定位。並且需要在他們的中心之間建立一條線來說明距離。我正在爲我的班級在圈子中遇到麻煩。當我將我的自定義圈添加到我的測試程序時,只有其中一個出現。我不知道爲什麼..我認爲我的代碼中的一個錯誤使程序跳過一些。因爲我只有一個圓圈出現。任何人都可以看到這段代碼有什麼問題嗎?

請記住我應該使用我迄今爲止學到的工具。 JPanel,JFrame,覆蓋paintComponent()。

Circle類:

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

public class Circle extends JPanel { 

public static final int OVAL = 1; 
public static final int ANOTHEROVAL = 2; 

public int OVALCENTER = 0; 
public int ANOTHEROVALCENTER = 0; 

private int type = 1; 
private boolean filled = false; 

public Circle(){ 

} 

public Circle(int type){ 
    this.type = type; 
} 

public Circle(int type, boolean filled){ 
    this.type = type; 
    this.filled = filled; 
} 

protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 

    int width = getWidth(); 
    int height = getHeight(); 
    int randomWidth = (int)(width * Math.random()); 
    int randomHeight = (int)(height * Math.random()); 

    switch (type){ 
    case OVAL: 
     g.setColor(Color.BLUE); 
     if(filled) 
      g.fillOval(randomWidth, randomHeight, 30, 30);  
     else 
      g.drawOval(randomWidth, randomHeight, 30, 30); 


    case ANOTHEROVAL: 
     g.setColor(Color.RED); 
      if(filled) 
       g.fillOval(randomWidth, randomHeight, 30, 30); 
      else 
       g.drawOval(randomWidth, randomHeight, 30, 30); 
      break; 

    } 
} 

}

而且測試程序:當我運行此,只有紅色圓圈將出現。

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

public class TestProgram extends JFrame { 
    public TestProgram(){ 
    add(new Circle(Circle.OVAL)); 
    add(new Circle(Circle.ANOTHEROVAL)); 

    } 

public static void main(String[] args) { 
    TestProgram sirkel = new TestProgram(); 
    sirkel.setSize(400, 300); 
    sirkel.setLocationRelativeTo(null); 
    sirkel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    sirkel.setVisible(true); 




} 

}

+0

嘗試改變他們的一個定位。我有一種感覺,他們互相重疊。 'g.drawOval(randomWidth,randomHeight,30,30);'。把30,30改成別的東西,看看會發生什麼。 –

+0

我將它改爲g。drawOval(randomWidth,randomHeight,90,90); 仍然只是一個圓圈。 Althoug從這個代碼中出現了它的RED圓圈。我也試圖改變其他圈子的起始位置,但是這也沒有幫助。 – Surangie

回答

1

嘗試佈局管理器將它們添加除了默認的BorderLayout看看會發生什麼

import java.awt.*;  

public TestProgram(){ 
    setLayout(new GridLayout(1, 2); 
    add(new Circle(Circle.OVAL)); 
    add(new Circle(Circle.ANOTHEROVAL)); 
} 

另一種解決方案就是使用JFrame的默認BorderLayout。如果您只是.add(something),它將自動添加到BorderLayout.CENTER,除非您指定位置。 BorderLayout並僅在每個位置保存一個組件。因此,當您嘗試添加第二個時,只有第二個將出現在CENTER的位置。

如果你沒有

public TestProgram(){ 
    setLayout(new GridLayout(1, 2); 
    add(new Circle(Circle.OVAL), BorderLayout.CENTER); 
    add(new Circle(Circle.ANOTHEROVAL), BorderLayout.SOUTH); 
} 

它也將工作

+0

非常有幫助!我調用了gridlayout,兩個圓圈都會出現:) 謝謝! – Surangie

1

首先,通過對每一個CircleJPanel,你將會有意想不到的結果因爲有兩個JPanels不能得出了同一個地方。相反,它們被放置在我的LayoutManager中。在這種情況下,我會想象你的一個面板在另一個面板上,所以你只能看到一個面板。

如果你想要圓圈在同一個「面板」(他們可以重疊),那麼你將需要一個JPanel可以繪製多個圓圈。

如果你想他們是「並排側」在單獨的面板,我想看看GridLayout

+1

非常有幫助!我調用了gridlayout,兩個圓圈都會出現:) 謝謝! – Surangie