2015-04-06 3 views
1

меня учили в моем классе, а также увидеть в этой книге (Big Java Early Objects), чтобы включать в себя инструкции рисовать в классе, простирающейся JComponent как:Является ли `super.paintComponent (g)` обязательным?

public class Component extends JComponent { 
    public void paintComponent(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     Rectangle r = new Rectangle(0,0,20,10); 
     g2.draw(r); 
    } 
} 

Однако кто-то отметил, что в первой строке в paintComponent метод должен быть: super.paintComponent(g);

Основываясь на моих ограниченных знаниях, я считаю, что он вызывает версию метода JComponent (теперь переопределена). Почему это должно произойти? Что произойдет, если я просто проигнорирую это утверждение, как я это делал до сих пор?

+0

«Однако кто-то указал, что первая строка в методе paintComponent должна быть:' - и вам также была предоставлена ​​ссылка на учебник Swing по «Custom Painting», который объясняет это более подробно и имеет рабочие примеры. Кроме того, вам еще нужно «принять» ответы на ваши вопросы. «Принимаемый» ответ указывает, что проблема решена, и поэтому все вопросы должны иметь принятый ответ. – camickr

+0

@BloodBrother Если этот ответ решил вашу проблему, пожалуйста, подумайте о его принятии. Если нет, то, по крайней мере, дайте некоторую обратную связь автору, чтобы он мог изменить его и дать лучшую помощь. –

ответ

1

Зачем это должно произойти? Что произойдет, если я просто проигнорирую это утверждение, как я это делал до сих пор?

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

Если вы не используете этот метод, у вас есть потенциал для рисования артефактов. Тогда может не всегда происходить, но вы не хотите тратить время на отладку.

Прочитано API для метода paintComponent()JComponent. Помимо прочего, в нем указывается:

Кроме того, если вы не выполняете реализацию invoker super, вы должны соблюдать непрозрачное свойство, то есть, если этот компонент непрозрачен, вы должны полностью заполнить фон непрозрачным цветом. Если вы не соблюдаете непрозрачную собственность, вы, скорее всего, увидите визуальные артефакты.

Так как минимум вам необходимо:

g.fillRect(0, 0, getWidth(), getHeight()); 

, чтобы убедиться, что фон очищается, прежде чем начать свои собственные живописи.

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