2014-01-18 2 views
1

Сначала я написал этот класс DrawOval.java следующим образом: -Рисунок овального использования drawOval() метод

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

Лучше дать диаметр значение по умолчанию, и никогда, я не повторяю ** никогда ** называть 'repaint()' внутри метода 'paint (Graphics g)' или 'paintComponent (Graphics g)'. Когда-либо. Это рискует потенциальной рекурсией и/или плохими побочными эффектами. Просто не делайте этого или не рекомендуйте это. –

Смежные вопросы