Как этот класс перерисовывается автоматически после нажатия мыши? - PullRequest
3 голосов
/ 05 февраля 2020

Я просто не понимаю, как здесь вызывается paint() или paintComponent(). Это из старого видео на YouTube еще в 2011 году; раздел комментариев этого видео не помог. Я ожидал, что этот код вызовет repaint() в методе mousePressed(), но это не так, и он просто работает.

Это видео на YouTube: https://www.youtube.com/watch?v=PrPwCKr6WNI


import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;

public class JavaApplication17 extends JFrame {

  int GWIDTH = 800;
  int GHEIGHT = 600;
  int x, y;
  private Image dbImage;
  private Graphics dbg;

  public JavaApplication17() {
    setSize(GWIDTH, GHEIGHT);
    setTitle("Game");
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addMouseListener(new Mouse());
    x = 15;
    y = 15;
  }

  public class Mouse extends MouseAdapter {

    @Override
    public void mousePressed(MouseEvent e) {
      int xCoord = e.getX();
      int yCoord = e.getY();
      x = xCoord + 7;
      y = yCoord + 7;
    }
  }

  public void paint(Graphics g) {
    dbImage = createImage(getWidth(), getHeight());
    dbg = dbImage.getGraphics();
    paintComponent(dbg);
    g.drawImage(dbImage, 0, 0, this);
  }

  public void paintComponent(Graphics g) {
    g.fillOval(x, y, 15, 15);
    repaint();
  }

  public static void main(String[] args) {
    JavaApplication17 main = new JavaApplication17();
  }

}

1 Ответ

1 голос
/ 06 февраля 2020

как здесь вызывается paint() или paintComponent()?

paintComponent() вызывается вашим кодом в методе paint().

paint() метод вызывается средой Swing каждый раз, когда требуется обновление кадра. Вызывая метод repaint(), вы информируете инфраструктуру Swing о том, что вашему фрейму необходимо обновить свое содержимое.

В IntelliJ IDEA этот код выглядит следующим образом:

paint method screenshot

Обратите внимание на букву O в синем круге. Это означает, что метод paint() переопределяет некоторый метод в родительском классе. В Java рекомендуется добавить модификатор @Override для пометки переопределенных методов.

Ваш класс JavaApplication17 расширяет класс JFrame, что означает, что он наследует все методы JFrame и его предков. Класс JFrame в свою очередь расширяет Frame и наследует все методы Frame и его предков. И так далее. См. Диаграмму иерархии классов:

Swing classes hierarchy

Window и Container оба класса реализуют свои методы public void paint(Graphics g). А в аннотации Component класс paint() вызывается методом update(). Вам не нужно вызывать метод paint() самостоятельно.

Если вы хотите узнать больше и понять, как он работает, прочитайте о OOP концепциях в Java (абстракция, инкапсуляция, наследование) и полиморфизм).

...