как работает paint () без вызова основного метода? - PullRequest
6 голосов
/ 14 октября 2011

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

import java.awt.*;
public class SimpleGraphics extends Canvas{

    /**
     * @param args
     */
    public static void main(String[] args) {
        SimpleGraphics c = new SimpleGraphics();
        c.setBackground(Color.white);
        c.setSize(250, 250);

        Frame f = new Frame();
        f.add(c); 
        f.setLayout(new FlowLayout()); 
        f.setSize(350,350);
        f.setVisible(true);
    }
    public void paint(Graphics g){
        g.setColor(Color.blue);
        g.drawLine(30, 30, 80, 80);
        g.drawRect(20, 150, 100, 100);
        g.fillRect(20, 150, 100, 100);
        g.fillOval(150, 20, 100, 100); 
    }
}

Нигде в основном методе не вызывается paint () на холсте. Но я запустил программу, и она работает, так как же работает метод paint ()?

Ответы [ 3 ]

14 голосов
/ 14 октября 2011

Метод paint вызывается потоком диспетчеризации событий (EDT) и в основном находится вне вашего контроля.

Он работает следующим образом: Когда вы понимаете пользовательский интерфейс (звоните setVisible(true) в вашем случае), Swing запускает EDT.Затем этот поток EDT запускается в фоновом режиме и всякий раз, когда ваш компонент должен быть закрашен, он вызывает метод paint с соответствующим экземпляром Graphics, который вы можете использовать для рисования.

Итак, когда этокомпонент "нужно" перекрасить?- Например, когда

  • Изменение размера окна
  • Компонент становится видимым
  • При вызове repaint
  • ...

Просто предположите, что он будет вызываться, когда это необходимо.

5 голосов
/ 14 октября 2011

На самом деле вы никогда не вызываете краски самостоятельно. Он вызывается автоматически всякий раз, когда необходимо перекрасить панель содержимого вашего фрейма. Это происходит, когда ваш кадр визуализируется в первый раз, изменяется, максимизируется (после минимизации) и т. Д.

3 голосов
/ 14 октября 2011

Если вы не знаете, как работает API рисования AWT / Swing (рендеринга), прочитайте эту статью - Рисование в AWT и Swing .

Метод рисования независимо отКак запускается запрос на рисование, AWT использует механизм «обратного вызова» для рисования, и этот механизм одинаков как для тяжелых, так и для легких компонентов.Это означает, что программа должна поместить код рендеринга компонента в определенный переопределенный метод, и инструментарий вызовет этот метод, когда придет время рисовать.Переопределенный метод находится в java.awt.Component.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...