2014-01-03 1 views
0

Почему обновление paintComponent каждый раз, когда я изменяю размер окна?Изменение размера окна вызывает paintComponent каждый раз при изменении размера окна?

Это класс, который я добавляю к JPanel, который добавляет JFrame. Является ли объект вызываемым каждый раз, когда окно изменено или что происходит с компонентом краски?

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.util.Random; 

import javax.swing.JComponent; 
import javax.swing.JPanel; 

class DrawString extends JPanel { 
    public void paint(Graphics g) { 
     Graphics2D g2 = (Graphics2D)g; 
     Font font = new Font("Serif", Font.PLAIN, 10); 
     g2.setFont(font); 
     g2.drawString("Test string",randInt(1,1000), randInt(1, 1000)); 

     for(int i = 0; i < 100; i++) { 
      g.setColor(new Color(randInt(1,255), randInt(1,255),randInt(1,255))); 
      g.drawLine(randInt(1,1000), randInt(1,1000), randInt(1,1000), randInt(1,1000)); 
     } 
    } 
    protected void paintComponent(Graphics g) { 
     // TODO Auto-generated method stub 
     super.paintComponent(g); 
     super.setBackground(new Color(100,100,100)); 
     paint(g); 
    } 
    public static int randInt(int min, int max) { 

     // Usually this can be a field rather than a method variable 
     Random rand = new Random(); 

     // nextInt is normally exclusive of the top value, 
     // so add 1 to make it inclusive 
     int randomNum = rand.nextInt((max - min) + 1) + min; 

     return randomNum; 
    } 
} 
+0

Когда окно изменяет размер, вызывается 'paintComponent()', чтобы дать окну изменения для адаптации к его новому размеру. Если вы вычисляете что-то каждый кадр, вы должны сделать это в отдельном методе, который вы вызываете, прежде чем вы вызовете 'repaint()', поэтому, если 'paintComponent()' из-за изменения размера, у вас не будет дополнительного кадра. – 11684

+0

Почему _shouldn't_ 'paintComponent' вызывается при изменении размеров окна? Вы меняете объем пространства для рисования _into_, либо отсекая часть окна, либо добавляя больше места для рисования. Если вы используете диспетчер компоновки, ваши компоненты также, вероятно, будут перемещаться и/или изменять размер с помощью окна, поэтому их также нужно будет рисовать по-разному. –

ответ

2

Это то, что происходит, когда вы комбинируете модель с видом. Никогда не совмещайте отображение gui/графики с внутренней логикой приложения. Они логически раздельны и должны оставаться такими.

Но ответ на ваш вопрос: у вас нет контроля над тем, когда вызывается paintComponent(). Даже вызов перерисовки - это не что иное, как предложение в графический интерфейс java, чтобы он перекрасил компонент.

И да, в большинстве случаев изменение размера приведет к вызову paintComponent().

1

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

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