java - 这个类如何在鼠标按下后自动重绘?

标签 java swing awt

我只是不明白这里如何调用 paint()paintComponent() 。这是 2011 年 YouTube 上的一个旧视频;该视频的评论部分没有帮助。我原本希望这段代码能够在 mousePressed() 方法中调用 repaint(),但它没有,而且它只是有效。

这是 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();
  }

}

最佳答案

how the paint() or paintComponent() is being called here?

paintComponent() 由您的代码在 paint() 方法中调用。

每次需要更新帧时,Swing 框架都会调用

paint() 方法。通过调用 repaint() 方法,您可以通知 Swing 框架您的框架需要更新其内容。

在 IntelliJ IDEA 中,此代码如下所示:

paint method screenshot

注意蓝色圆圈中的字母O。这意味着 paint() 方法重写了父类中的某些方法。在Java中,建议添加@Override修饰符来标记重写的方法。

您的类JavaApplication17扩展了类JFrame,这意味着它继承了JFrame及其祖先的所有方法。 JFrame 类又扩展了 Frame 并继承了 Frame 及其祖先的所有方法。等等。参见类层次结构图:

Swing classes hierarchy

WindowContainer 类都实现了它们的 public void Paint(Graphics g) 方法。在抽象 Component 类中,paint()update() 方法调用。您不需要自己调用 paint() 方法。

如果您想了解更多信息并了解其工作原理,请阅读 Java 中的 OOP 概念(抽象、封装、继承和多态性)。

关于java - 这个类如何在鼠标按下后自动重绘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60073472/

相关文章:

java - 启用/禁用 AWT 按钮

java - 自动从 png sprite 表中查找帧尺寸

java - 调用 EntityManager.merge() 时未设置 ID

java - 在 Android Studio 中添加依赖项时出现问题?

Java toString() 未打印正确的变量

java - 如何使用单个 JOptionPane.showMessageDialog() 语句显示多个输出?

java - 为什么 paintComponent 没有在面板上绘制?

java - 无法在框架 'java AWT' 中添加简单的复选框

java - 将不同的字符串数组添加到 List<String[]> 中,但返回相同的值

java - 如何使JCheckbox数组具有动态长度?