2014-01-18 301 views
1

起初我寫這個類DrawOval.java如下: -繪製橢圓

public class DrawOval extends JPanel{ 
    private int diameter = 10; 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.fillOval(10,10,diameter,diameter); 
    } 
    public void setDiameter(int newD){ 
     diameter = (newD>=0 ? newD : 10); 
     repaint(); 
    } 
    public Dimension getPreferredSize(){ 
     return new Dimension(200,200); 
    } 
    public Dimension getMinimumSize(){ 
     return getPreferredSize(); 
    } 
} 

然後我寫這個類TheWindow.java如下: -

public class TheWindow extends JFrame{ 
    private DrawOval myPanel; 
    public TheWindow(){ 
     super("The title"); 
     myPanel = new DrawOval(); 
     myPanel.setBackground(Color.GREEN); 
     add(myPanel,BorderLayout.CENTER); 
    } 
} 

在最後我寫了如下的主要類: -

public class Test{ 
    public static void main(String[] args){ 
     TheWindow w = new TheWindow(); 
     w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     w.setSize(300,300); 
     w.setVisible(true); 
    } 
} 

並且輸出只是一個沒有任何橢圓形的綠色背景的框架?

回答

1

你永遠不會打電話setDiameter(...),所以該字段保持0值,並不會繪製橢圓。

一個解決方案是在每次創建DrawOval對象時嘗試記住調用此方法,但爲何強制自己記住這一點?而是使直徑成爲構造函數的參數,並確保該類沒有默認構造函數,以便在創建對象時將直徑字段必須設置爲某個值。另一個選擇是給直徑字段一個默認值,以便即使它從未明確設置,它將始終被隱式設置。

0

您應該調用setDiameter方法來繪製橢圓形狀。 但我認爲你應該將此方法與paintComponent合併。通過這種方式,你不應該關心調用方法。

我的意思是:

public void paintComponent(Graphics g, int newD){ 

    super.paintComponent(g); 

    diameter = (newD>=0 ? newD : 10); 
    repaint();   

    g.fillOval(10,10,diameter,diameter); 

} 
+0

請澄清:合併有什麼的paintComponent? –

+0

我的意思是你應該把setDiameter方法的代碼放在paintComponent中。您不需要單獨的方法來完成此任務。這樣你就不需要調用這個方法。我會編輯我的答案,看看我的意思。 –

+0

更好地給直徑一個默認值,並且永遠不要**在'paint(Graphics g)'或'paintComponent(Graphics g)'方法內部調用'repaint()'。永遠。這有潛在的遞歸和/或不良副作用的風險。只是不要這樣做或推薦這個。 –