2015-10-29 3 views
1

Вот пример кода:JPanel's paintComponent();

public class MyClass extends JPanel 
{ 
     Image img; 
     public MyClass(Image img) { 
     this.img = img; 
     } 
     ... 

     void paintComponent(Graphics g) { 
      g.drawImage(img, 0, 0, this); 
     } 

     void someFunction() { 
      img = (Image) inputStream.getObject(); 
     } 
} 

Будет paintComponent() также получить автоматически вызывается, если img так много, как получает совершенно новый Image экземпляр?

Кроме того, существует ли применение методов paint() и repaint() в этом контексте?

+2

Нет, Swing не будет перерисовываться, если вы присвоите переменной новое значение. Я рекомендую проверить [пользовательскую роспись в качели] (https://docs.oracle.com/javase/tutorial/uiswing/painting/). В 'someFunction' вы должны называть' repaint' –

+1

Помните, что первая строка кода в переопределенном методе paintComponent * должна * быть 'super.paintComponent (g)'. В противном случае вы получите непредсказуемые артефакты. – VGR

+0

Спасибо. Я полагаю, что 'repaint()' называет 'paintComponent()' внутренне, верно? @VGR: Не могли бы вы объяснить, почему это так? Например, что делает суперкласс '' paintComponent() 'специально и где будут происходить эти артефакты? – WIlopu

ответ

2

№ В частности, изменение переменных или вызывающих методов Component, таких как someFunction(), не подразумевает запуск paintComponent(), если этот метод не предназначен для этого. Например метод someFunction() можно перекрашивать всякий раз, когда это называется следующим образом:

void someFunction() { 
    img = (Image) inputStream.getObject(); 
    repaint(); 
} 

Но вы все равно должны вызвать repaint() где бы вы изменить img, которые будут склонны к ошибкам, если вы это много. Более плавный подход (который позволяет вам передавать изображения внешне, если это возможно) заключается в том, чтобы написать сеттер, предлагающий перерисовку.

public void setImage(Image img){ 
    this.img = img; 
    repaint(); 
} 

и использовать этот метод вместо прямого изменения переменной. например .:

void someFunction() { 
    setImage((Image) inputStream.getObject()); 
} 

Наконец, repaint() может в конечном счете вызвать paint(), но вы, как правило, не называют paint() напрямую, потому что repaint() лучше управляется. См. paint vs repaint и Painting in AWT and Swing для получения дополнительной информации.

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