Java JFrame调用JPanel paintComponent

Java JFrame调用JPanel paintComponent,java,swing,graphics,awt,Java,Swing,Graphics,Awt,我实际上是在用Java学习图形。我无法理解这个JFrame对象如何调用MyDrawpanel中的paintComponent方法,该方法扩展了JPanel frame.repaint()再次调用paintComponent但是如何调用呢?为什么我不能像drawPanel.repaint()那样使用MyDrawPanel的drawPanel对象 为什么我不能像drawPanel.repaint()那样使用MyDrawPanel的drawPanel对象 当前,您的frame变量被定义为实例变量,因此

我实际上是在用Java学习图形。我无法理解这个
JFrame
对象如何调用
MyDrawpanel
中的
paintComponent
方法,该方法扩展了
JPanel

frame.repaint()
再次调用
paintComponent
但是如何调用呢?为什么我不能像
drawPanel.repaint()那样使用
MyDrawPanel
drawPanel
对象

为什么我不能像drawPanel.repaint()那样使用MyDrawPanel的drawPanel对象

当前,您的
frame
变量被定义为
实例
变量,因此它可以在类的任何方法中引用

但是,您的
drawPanel
变量被定义为
local
变量,因此只能在定义它的方法中引用它

更改
drawPanel
变量,使其定义为
instance
变量,而不是
local
变量。然后可以在
actionPerformed(…)
方法中使用
drawPanel.repaint()

在面板上调用repain()会更有效,因为只有面板将被重新绘制,而不是框架和按钮

另外,您使用的是旧版本的add(…)方法

您应该使用:

frame.getContentPane().add(button, BorderLayout.SOUTH);
现在,框架将向内容窗格转发添加(…)请求,以便您可以实际使用:

frame.add(button, BorderLayout.SOUTH);

为了节省键入的时间。

调用
repaint()
告诉绘制管理器绘制组件及其包含的所有子组件。这是绘制“链”的一部分。查看::Swing图形的入门教程。还有:Swing Graphics的高级教程但是frame对象如何调用repaint()的简短回答是“它很复杂”,有时,在获得足够的API经验之前,您需要接受一点“黑魔法”。话虽如此,您应该通读一遍,以便更好地理解绘制系统的工作原理“但是frame对象如何调用该repaint()”——绘制请求由帧响应
setSize
setVisible
。并非所有方法都会这样做,但有些方法必须这样做才能触发布局/绘制过程
frame.getContentPane().add(button, BorderLayout.SOUTH);
frame.add(button, BorderLayout.SOUTH);