2015-04-20 1 views
1

Я новичок в Java. Ниже приведены два класса, один класс расширяет JComponent, необходимо переопределить метод paintComponent. Другой класс расширяет JPanel, также необходимо переопределить метод paintComponent.paintComponent и super.paintComponent

Почему DrawingPanel класс (продлить JPanel) необходимо вызвать метод super.paintComponent(g), но CollageComponent (продлить JComponent) не нужно вызывать super.paintComponent(g)?

Я так смущен.

public class CollageComponent extends JComponent { 

    public void paintComponent(Graphics g) { 

     g.setColor(Color.ORANGE); 
     g.fillRect(100, 50, 300, 75); 

     // inner green fill 
     g.setColor(Color.GREEN); 
     g.fillOval(300, 75, 100, 75); 

    } 
} 


public class DrawingPanel extends JPanel { 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.ORANGE); 
     g.fillRect(100, 50, 300, 75); 

     // inner green fill 
     g.setColor(Color.GREEN); 
     g.fillOval(300, 75, 100, 75); 

    } 
} 
+0

Я бы сказал, что вам нужно всегда называть его, потому что 'JPanel' расширяет' JComponent' и 'JComponent' имеет код, необходимый для выполнения –

+0

, но CollageComponent также расширяет JComponent. – user3559982

ответ

1

В соответствии с Java -awt/свинг классов API hirearchy, компонент является супер класс Container.Therefore вам нужно вызвать конструктор класса Parent (Component) из дочерних классов (контейнеров) с использованием супер ключевого слова.

+0

, но CollageComponent расширяет JComponent, тогда CollageComponent является подклассом, а JComponent является суперклассом, почему этому классу не нужно использовать супер ключевое слово для переопределения? – user3559982

+0

Если CollageComponent является прямым подклассом JComponent, тогда ему нужно использовать «супер» ключевое слово. Поскольку CollageComponent не использует ключевое слово «супер», он может быть не прямым подклассом JComponent. Возможно, это любой промежуточный класс между JComponent и CollageComponent. –

3

При вызове super.paintComponent() вы убедитесь, что по умолчанию для этого компонента и этого LAF.

Для JPanel это в основном означает, что фон окрашен. Фон может быть разным для каждого ЛАФ.

Для JComponent действительно не существует по умолчанию, так как каждый класс, который расширяет JComponent, несет ответственность за то, чтобы удостовериться, что вся область компонента окрашена.

В вашем простом примере код будет работать, поскольку по умолчанию JComponent прозрачен, что означает, что фон окрашен родителем вашего компонента. Если весь фон не окрашен, то есть возможность рисовать артефакты, появляющиеся в определенных условиях (которые я не помню в это время).

Однако, если какой-либо ЛАФ решает, что они хотят установить по умолчанию для класса JComponent, ваш код никогда не будет использовать эту картину, и ваш компонент будет выглядеть странно в этом LAF. Так что всегда безопасно вызывать super.paintComponent() при выполнении пользовательской раскраски.

Edit:

Стандартный код для окраски фона является:

if (isOpaque()) 
{ 
    g.setColor(getBackground()); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
} 

Вы бы просто добавить этот код в начале метода paintComponent().

+0

Итак, оригинальный класс класса paintComponent - это рисование фона? Я видел некоторые коды онлайн «расширяет JComponent», некоторые «расширяет JPanel», а затем добавляют его в JFrame для отображения чертежа. Итак, когда мне следует расширять JComponent и расширять JPanel? – user3559982

+0

Ну, все компоненты Swing расширяют JComponent. Теоретически, если вы создаете настраиваемый компонент, вы должны расширить JComponent. Это означает, что вам нужно будет сделать компонент непрозрачным и реализовать свой собственный код рисования, чтобы каждый раз рисовать фон, прежде чем делать свою собственную собственную картину. JPanel предназначен для хранения дочерних компонентов.Но многие люди используют тот факт, что JPanel автоматически рисует фон, поэтому они расширяют JPanel. – camickr

+0

Спасибо, теперь это имеет для меня больше смысла. Я просто просматриваю документ paintComponent, он говорит: «Если вы не выполняете реализацию invoker super, вы должны соблюдать непрозрачное свойство, то есть если этот компонент непрозрачен, вы должны полностью заполнить фон непрозрачным цветом. не соблюдайте непрозрачную собственность, вы, вероятно, увидите визуальные артефакты ». Что это значит? Как мы можем узнать, непрозрачен ли компонент или нет? Какой цвет фона используется для заполнения? Как мой пример кода (расширение JComponent), у него нет никакого кода для рисования фона. Извините, Моя голова застряла. – user3559982