荷犸 2015-09-23 03:18 采纳率: 0%
浏览 3305

请问大神们Java里的JPanel.repaint和JFrame.repaint的区别是什么?

Java小白一个,在看headfirst JAVA,书上有一个小的动画代码,是每个几秒画一个圆
然后圆的位置不断变化,书上故意用了JPanel.repaint这个方法,结果产生了运动痕迹,
然后书上提出的解决方法是repaint的时候先画一个大的白色的正方形把原来的圆盖住,
然后才画下一个圆。我实践的时候突发奇想用了JFrame.repaint来代替这个
JPanel.repaint,结果发现不用像书上那样也可以消除运动轨迹。那么问题就来了:
JFrame.repaint和JPanel.repaint这两个方法有什么不同呢?为什么一个可以消除痕迹一个不可以呢?JFrame.repaint做动画方面是不是更好呢?或者说什么时候不可以用它呢?
谢谢!

  • 写回答

2条回答 默认 最新

  • 请叫我大星星 2020-01-04 22:35
    关注

    首先呢,我尝试了那段代码,JFrame和JPanel的repaint结果是一样的,不知道你为什么会出现不一样的结果。

    然后呢,其实当你使用JFrame和JPanel调用repaint这个方法时都会执行Component中的repaint方法,然后它会向repaint管理器发送repaint请求。
    如果组件是轻量级组件,则会调用Component中的paint方法,如果是重量级组件则会调用Component中的update方法,JFrame和JPanel都是轻量级组件。(轻量级和重量级你自行再百度一下吧)
    由于Component的paint方法将调用 paintComponent(), paintBorder() 和 paintChildren() 这将使组件绘制本身,它的边框和级联绘画以递归方式呈现给它的所有子节点,它们的子节点,它们子节点的子节点。在JFrame上调用它将导致此级联在整个顶级窗口中发生,而在JPanel上调用它将导致仅重新绘制该组件及其子组件。
    因此当你重写了paintComponent() 方法时,使用JFrame的repaint会刷新整个顶级窗口,你也可以理解为新的窗口覆盖了旧窗口,此时看不到之前的图形。
    但是在你重写paintComponent() 方法后,使用JPanel的repaint就会留下原来的组件,新的组件只会覆盖(或者说叠加)到旧的上面。如果你在重写中加入super.paintComponent(g),那么只会显示新的组件。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)