JPanel子类TwoButtons及SimpleAnimation无法显示图形的问题求助
嘿,我明白你折腾两天的烦躁啦!其实问题出在两个很容易忽略的小细节上,咱们马上搞定它~
第一个核心问题:绘制方法名拼写错误
你在MyDrawPanel类里写的是paintConponent,但正确的方法名应该是paintComponent——注意中间的Component是有两个m的!
这个方法是Swing组件用来完成绘制的核心方法,拼写错了之后,JVM根本不会调用你的绘制逻辑,所以窗口里自然看不到圆形啦。不管是TwoButtons里的MyDrawPanel还是SimpleAnimation里的,都犯了这个拼写错误。
第二个问题:SimpleAnimation的重绘刷新问题
除了方法名拼写,SimpleAnimation里的MyDrawPanel还有个小问题:你没有在paintComponent里调用父类的super.paintComponent(g)。这会导致每次重绘的时候,面板不会清除之前画的圆形,结果就是圆形移动的时候会留下一串“尾巴”。
修正后的代码
修正后的TwoButtons里的MyDrawPanel:
import javax.swing.JPanel; import java.awt.*; public class MyDrawPanel extends JPanel { public void paintComponent(Graphics g) { // 修正方法名拼写 Graphics2D g2d = (Graphics2D) g; int red = (int) (Math.random() * 255); int green = (int) (Math.random() * 255); int blue = (int) (Math.random() * 255); Color startColor = new Color(red, green, blue); red = (int) (Math.random() * 255); green = (int) (Math.random() * 255); blue = (int) (Math.random() * 255); Color endColor = new Color(red, green, blue); GradientPaint gradient = new GradientPaint(70, 70, startColor, 150, 150, endColor); g2d.setPaint(gradient); g2d.fillOval(70, 70, 100, 100); } }
修正后的SimpleAnimation里的MyDrawPanel:
class MyDrawPanel extends JPanel{ public void paintComponent(Graphics g) { // 修正方法名拼写 super.paintComponent(g); // 新增:调用父类方法刷新背景 g.setColor(Color.green); g.fillOval(x, y, 40, 40); } }
补充说明
- 对于Swing的自定义绘制,必须严格拼写
paintComponent,这是Java的约定,拼写错误就不会触发绘制逻辑。 - 调用
super.paintComponent(g)是个好习惯,它会帮你处理面板的背景刷新、边框绘制等默认操作,避免出现绘制残留的问题。
现在把修正后的代码替换进去,运行试试,应该就能看到正常的圆形和动画啦!
内容的提问来源于stack exchange,提问作者Jaycee Zhou
相关产品推荐
相关产品推荐

