首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么draw()方法中的repaint()不起作用(不调用paint())?

在Java中,当我们使用图形界面库(如Swing或JavaFX)创建用户界面时,通常会重写paint()方法来绘制组件的外观。repaint()方法用于触发界面的重新绘制,它会调用paint()方法来更新组件的外观。

然而,有时候在draw()方法中调用repaint()方法后,paint()方法并没有被调用,界面也没有更新。这可能是由于以下几个原因:

  1. 组件没有被正确添加到容器中:确保组件已经被添加到容器,并且容器已经显示在屏幕上。如果组件没有被添加到容器,或者容器没有被添加到顶层容器(如JFrame),则repaint()方法不会起作用。
  2. 组件的可见性被设置为false:如果组件的可见性被设置为false,即setVisible(false),则repaint()方法不会触发界面的重新绘制。确保组件的可见性被设置为true,即setVisible(true)
  3. 组件的大小为0:如果组件的宽度或高度为0,即getWidth() == 0getHeight() == 0,则repaint()方法不会起作用。确保组件的大小大于0,可以通过设置合适的大小或使用布局管理器来自动调整大小。
  4. 组件的不透明度设置为0:如果组件的不透明度被设置为0,即setOpaque(false),则repaint()方法不会触发界面的重新绘制。确保组件的不透明度大于0,可以通过设置为true或使用其他透明度值。
  5. 组件的重绘区域为空:如果组件的重绘区域为空,即repaint(0, 0, 0, 0),则repaint()方法不会起作用。确保重绘区域的坐标和大小正确设置,以包含需要重新绘制的区域。

需要注意的是,repaint()方法只是触发界面的重新绘制请求,具体的绘制操作由系统自动调用paint()方法来完成。如果paint()方法中的绘制逻辑有问题,或者组件的绘制被其他因素阻塞,也会导致界面不更新。

总结起来,draw()方法中的repaint()不起作用可能是由于组件没有正确添加到容器、组件的可见性、大小、不透明度设置不正确,或者组件的重绘区域为空。确保这些因素正确设置,并检查paint()方法的实现是否正确,以确保界面能够正确更新。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Flutter 绘制探索 6 | 深入分析 CustomPaint 组件 | 七日打卡

可以看到唯一设置方式就是过CustomPainter 构造函数。 这也是为什么子类只能在 super 设置原因。 ? ---- 2....相关类 说过 RenderCustomPaint 渲染对象会持有 CustomPainter ,并在 attach 方法调用 _painter#addListener 将 markNeedsPaint..._foregroundPainter 也是类似,可以看到在 RenderCustomPaint#paint 方法,是先画背景 _painter 、再使用 super.paint 绘制 child 、最后用...在上面的绘制之后,会调用 _setRasterCacheHints 方法来设置绘制上下文中属性,最后属性被设置给 _currentLayer。...CustomPaint size 可能你在使用 CustomPainter#paint 方法内回调 size 对象时,有些困惑,为什么有时候会是 Size(0,0),那么这里来一起探索一下回调

1.4K10

android使用Path绘制出多边形

activity压入栈,translate()是画布平移,其实每次画布还是同一个画布,通过paint绘制图形都是在这同一个canvas上,但是绘制内容跟你是否使用了translate()有关系,下面通过简单...上面的红点是坐标点(100,100)位置,为什么绘制蓝色文字是在坐标点(100,100)位置呢?...,默认都是透明,否则你draw…2次,上次绘制内容就被覆盖了,文字太苍白无力,就好像你对一个女孩说一千篇我爱你,还不如说你在杭州买了套房来实际,就好像香港有一个电影台词是这么说,这是一个最好时代...第三种: int count = canvas.save(Canvas.MATRIX_SAVE_FLAG);//这个看你是在canvas.draw...哪里调用了,就相当于保存画布 canvas.restoreToCount...当然你要在绘制这个图形之前对画布进行旋转,不然不起作用,网上有些五角星效果,是怎么实现呢?比如这样效果: ? 这是正6变形所形成星星形状,分析如图: ?

1.3K20

创建子类对象时,父类构造函数调用被子类重写方法为什么调用是子类方法

A对象时候父类会调用子类方法?...但是:创建B对象父类会调用父类方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存。...如果,子类重写了父类方法,子类方法引用会指向子类方法,否则子类方法引用会指向父类方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,父类构造方法调用方法参数已经强制转换为符合父类方法参数了。 上边代码在编译前已经转换为下面这个样子了。

6.1K10

前端秘法进阶篇----这还是我们熟悉浏览器吗?(浏览器渲染原理)

绘制(Paint) 再下一步是绘制 主线程会为每个层单独产生绘制指令集,用于描述这一层内容该如何画出来。...合成线程会把 quad 提交给 GPU 进程,由 GPU 进程产生系统调用,提交给 GPU 硬件,完成最终屏幕成像。 四.附加面试题 1.什么是 reflow?...repaint 本质就是重新根据分层信息计算了绘制指令。 当改动了可见样式后,就需要重新计算,会引发 repaint。...由于元素布局信息也属于可见样式,所以 reflow 一定会引起 repaint。 3.为什么 transform 效率高?...因为 transform 既不会影响布局也不会影响绘制指令,它影响只是渲染流程最后一个「draw」阶段 由于 draw 阶段在合成线程,所以 transform 变化几乎不会影响渲染主线程。

9910

【专业技术】chromium GPU 硬件加速合成

有了compositor layer 他们就可以单独进行渲染,不影响其他刷新内容,提供网页渲染性能。 那么执行compositing 任务需要哪些步骤?...提供,RenderLayer类代表 compositor正真数据对象,当需要时会被paint到backing store.RenderLayer对象拥有CompositedLayerMapping。...2)RenderLyaerCompositor::rebuildComositingLayerTree 调用compositedLayerMapping 设置layer clipping区域内容,为paint...compositor 控制paint时机,提供给RenderLayer 合适context,和paint 解析结构。 3.触发平台Draw方法 注:上面分析基于chromium 39 源码....在渲染上Chromium 提供先进"CC",但是在游戏领域,对于一些MMO,RPG,社交游戏这种特点游戏支持作用就相当弱了, 因为Chromium 在局部repaint 起到绝佳作用,而提到这些类型游戏

1.8K60

关于 java set,get方法,而为什么推荐直接使用public

这里引入其中一句话: 在任何相互关系,具有关系所涉及各方都遵守边界是十分重要事情,当创建一个类库时,就建立了与客户端程序员之间关系,他们同样也是程序员,但是他们是使用你类库来构建应用...,或者构建更大类库程序员。...如果所有的类成员对任何人都是可用,那么客户端程序员就可以对类做任何事情,而不受约束。即使你希望客户端程序员不要直接操作你某些成员,但是如果没有任何访问控制,将无法阻止此事发生。...所以只有我自己本身才能调用,这也就是private修饰作用。 网上也有说,如果让你接手一个项目,里面都是用了 public,那么对于这个数值操作,岂不是得又翻一下项目了。...补充说明,set字面意思设置,get获取,我们了解一下java面向对象编程封闭性与安全性,private 修饰set get方法方法封闭在了一个特定类,其他类就无法对其变量进行方法,这样就提高了数据安全性

1.4K20

vcl啥意思_oval

DrawCell是一个纯虚方法,在Paint中被调用(具体过程参见下文),因此理解重点是在两个地方: (1)Paint有什么用,Paint是如何运作。 (2)Paint做了什么工作。...1、Paint运作机制。 前面说过了,Paint用来绘制控件自身外形。Paint内部定义了具体绘制方法,因此,只要在适当时间和地点调用Paint,就可以改变控件外 观。...在VCL,可将Paint方法简单理解为TControl对Windows标准消息WM_PAINT反应。...调用Win32 APIUpdateWindow、RedrawWindow和InvalidateRect以及VCLTControlRepaint、Refresh和Update方法等都会直接或者间接引发相应...因此,网格控件基本运作原理就是:数据或者数据源本身发生变化后,通过适当方式调用Paint方法,从而更新数据填充。

84430

Java游戏编程不完全详解-2(1万6千字吐血推荐)

方法paint 转发给任意一个此容器子组件轻量级组件 在窗体显示字符串。在显示全屏幕之后,在屏幕绘制文字!...所有作为此Graphics对象方法参数而出现坐标,都是相对于调用方法此Graphics对象转换原 点。...如果需要强制呼叫paint方法,那么需要我们呼叫repaint方法即可,因为该方法会给AWT一个信号,然后让AWT来呼叫paint方法。...该方法paint转发给任意一个此容器组件轻量级组件,如果重新实现此 方法,那么JVM应该调用super.paint(g)方法,从而正确呈现轻量级组件。...前面的例子是使用paint方法来呈现,我们呼叫repaint方法,向AWT事件分发线程发送信号,让它重新刷新屏幕,但是这种做法会产生延迟,因为AWT线程可能会在忙于别的事情。

1.5K30

双缓冲原理在Awt和Swing实现消除闪烁方法总结

---- 在Awt对于窗体画布重绘其条用顺序是repaint() —>update()—>paint(); 默认upadate()自带clearRect()方法,即清屏功能,程序运行时我们调用repaint...中继承而来,而JFrame却重写了update()方法如下: public void update(Graphics g) { paint(g); } 对比之后会发现直接调用了...repaint()方法在重量级组件时候会调用update方法,在轻量级组件时候会调用paint方法 即JFrame根本不会去调用update()方法!...(image, 0, 0, null); } 其中最重要是 super.paint(imageG ); 这里必须先调用父类Frame方法刷新屏幕清理上一次repaint画出图像。...然后可以创建一个线程让程序每隔一段时间后自动调用repaint()方法

2.2K20

java双缓冲技术

本文从实例出发,着重介绍了用双缓冲消除闪烁原理以及双缓冲在Java两种常用实现方法(即在update(Graphics g)实现和在paint(Graphics g)实现),以期读者能对双缓冲在...DoubleBuffer对象建立后,显示窗口,程序首先自动调用重载后paint(Graphics g)函数,在窗口上绘制了一个小圆,绘图线程启动后,该线程每隔30ms修改一下小圆位置,然后调用repaint...1、重载paint(Graphics g)实现双缓冲: 这种方法要求我们将双缓冲处理放在paint(Graphics g)函数,那么具体该怎么实现呢?...注意,将这个过程联系起来repaint()函数。paint(Graphics g)是一个系统调用语句,不能由程序员手工调用。只能通过repaint()函数调用。...2、关于消除闪烁方法补充: 上文提到双缓冲实现方法只是消除闪烁方法一种。

2.2K80

Java俄罗斯方块,老程序员花了一个周末,连接中学年代!

(rect); //g_2d.drawRect(336, 6, 140, 413); } 在BackPanel 重写paint 方法,并调用刚才两个区域绘制方法。...方法调用 创建游戏右边区域一个暂停按钮 //初始化 private void init() { // 开始/停止按钮 btnStart = new JButton(); btnStart.setFont...方法调用draw绘制方法 private void init() { x=0; y=0; curBlock = new Block(x, y,this); } @Override public...4个Block实例,每个小块调用自己move方法即可: 效果如下: 模型旋转变形 旋转万能公式 x=-y y=x 这里x、y指的是Data类里面二维数组值,也就是 Block偏移值...curModel = nextModel; nextModel = new Model(x,y,this); } } 在paint方法绘制‘下一个’,在右边下一个区域显示 //

75820

Java-GUI编程之绘图

在Component类,提供了下列三个方法来完成组件图形绘制与刷新: ​ paint(Graphics g):绘制组件外观; ​ update(Graphics g):内部调用paint方法,刷新组件外观...; ​ repaint():调用update方法,刷新组件外观; 一般情况下,update和paint方法是由AWT系统负责调用,如果程序要希望系统重新绘制组件,可以调用repaint方法完成。...程序绘图也一样,也需要画布,画笔,颜料等等。AWT中提供了Canvas类充当画布,提供了Graphics类来充当画笔,通过调用Graphics对象setColor()方法可以给画笔设置颜色。...画图步骤: 1.自定义类,继承Canvas类,重写paint(Graphics g)方法完成画图; 2.在paint方法内部,真正开始画图之前调用Graphics对象setColor()、setFont...()等方法设置画笔颜色、字体等属性; 3.调用Graphics画笔drawXxx()方法开始画图。

1.1K00

BufferedImage与byte[]互转

一、需要用到类 java.awt.image.BufferedImage; javax.imageio.ImageIO; java.io.*; 二、为什么要将BufferedImage转为byte...数组 在传输,图片是不能直接传,因此需要把图片变为字节数组,然后传输比较方便;只需要一般输出流write方法即可; 而字节数组变成BufferedImage能够还原图像; 三、如何取得BufferedImage...)); 四、BufferedImage  ---->byte[] ImageIO.write(BufferedImage image,String format,OutputStream out);方法可以很好解决问题...而这里in可以为ByteArrayInputStream(); 六、显示BufferedImage public void paint(Graphics g){ super.paint(g); g.drawImage...(image,x,y,width,height,null);    //image为BufferedImage类型 } 如果要自动调用paint方法,则需要调用repaint()方法; 七、实例

2.1K10
领券