荷犸 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 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型