这是代码:
public void paint(Graphics g) {
g.fillOval(x, y, 25, 25);
repaint();
}
这将创建一个这样的输出,如果我移动指针,它不会清除以前的图形并创建一个 路径 .
以上代码的输出
通过添加这样的超级语句,它不显示路径,而只显示椭圆图形的当前位置。
public void paint(Graphics g) {
super.paint(g);
g.fillOval(x, y, 25, 25);
repaint();
}
输出是 这
我只想谈谈这背后的机制和原因。
抱歉,您的代码存在太多错误,我们必须修复它:
- 首先,不要覆盖 JComponent(或 JFrame)的 paint 方法,而是覆盖 JComponent 或 JPanel 的 paintComponent。这样,您可以避免错误地弄乱边框或子组件的绘制,这两者都是油漆负责的。此外,由于paintComponent具有自动双重缓冲功能,因此您的动画将更加流畅。
- 接下来,你几乎总是想调用super的绘制方法,对于paintComponent来说,这是
super.paintComponent(g)
的,因为它将继续传播绘制链,而不调用它,你会破坏这个链。调用 super's 方法将调用组件的内务绘制,包括"脏"像素的过度绘制,这就是删除轨迹的原因。这可能是您正在寻找的答案。 - 最重要的是,永远不要从任何绘画方法中调用
repaint()
。这样做会导致一个完全无法控制的穷人动画,并且给绘画方法带来了太多的责任,而绘画方法应该专注于它的唯一工作 - 绘制组件。请改用游戏循环,例如摆动计时器。
最重要的是 - 阅读教程,因为其中大部分已经在那里解释过:
- 课程:执行自定义绘画:摆动图形入门教程
- 在 AWT 和 Swing 中绘画:关于 Swing 图形的高级教程
直接来自文档
公共空隙涂料(图形g)
为容器上漆。这会将油漆转发给任何轻量级作为此容器的子级的组件。如果此方法是重新实现,应该调用super.paint(g),以便轻量级组件已正确呈现。如果子组件完全是被 G 中的当前剪切设置剪裁,paint() 将不会转发给那个孩子。
正如他所说,super.paint()可以清理脏像素。这说明了一切.!!:)