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

为什么拖动这个jpanel会产生屏幕撕裂效果?

拖动JPanel产生屏幕撕裂效果的原因是因为缺乏双缓冲机制。在Java Swing中,当我们拖动一个JPanel时,它的重绘过程可能会与屏幕的刷新频率不同步,导致部分区域的绘制在屏幕上出现撕裂的现象。

为了解决这个问题,可以使用双缓冲技术。双缓冲技术是指在内存中创建一个与屏幕画面一致的缓冲区,先将绘制操作在缓冲区中完成,然后再将整个缓冲区一次性地绘制到屏幕上,从而避免了绘制过程中的撕裂现象。

在Java Swing中,可以通过以下步骤实现双缓冲:

  1. 创建一个继承自JPanel的自定义面板类,并重写其paintComponent方法。
  2. 在自定义面板类的构造方法中调用setDoubleBuffered方法,将双缓冲设置为true。
  3. 在paintComponent方法中,使用Graphics对象的create方法创建一个新的Graphics对象,并将其传入绘制方法中,确保绘制操作在新的Graphics对象上进行。
  4. 在绘制完成后,调用dispose方法释放新的Graphics对象。

以下是一个示例代码:

代码语言:txt
复制
import javax.swing.*;
import java.awt.*;

public class DoubleBufferedPanel extends JPanel {
    public DoubleBufferedPanel() {
        setDoubleBuffered(true);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g.create();

        // 在新的Graphics对象上进行绘制操作

        g2d.dispose();
    }
}

通过使用双缓冲技术,可以有效地解决拖动JPanel时产生屏幕撕裂效果的问题。

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

相关·内容

关于gsync 和 freesync

普通情况下显卡是逐行扫描到显示器,这就导致前面一帧还没扫完下一帧就上去了,因此产生撕裂,垂直同步则是让显卡去适应显示器,即显示器每次刷新的时候显卡再把算好的图像传给显示器。...2、仅显卡输出的FPS大于显示器刷新率才是完美效果,如果低于刷新率,虽然依然不会画面撕裂,但会造成卡顿。 最佳用途:可以保证游戏FPS大于显示器刷新率,且不介意延迟增大。...这时你的电脑获得了最佳游戏效果,帧率不受限制的情况下完美解决任何情况下的撕裂问题。...为什么笔记本存在不支持G的显卡(其实是存在的23333因为我的就是)? 造成这种现象只有一个原因:授权费。 G-SYNC是基于eDP自带技术而来,理论上任何独显输出笔记本都能开G。...笔记本平台所谓的屏幕带不带G,其实就是老黄、oem厂商选定的屏幕型号,把它们以白名单形式存在于BIOS中,当屏幕型号正确,即可使用G-SYNC。

5.1K20

屏幕成像原理以及FPS优化Tips

Vsync信号是由硬件时钟产生的一个脉冲信号,起到开关或触发某种操作的作用。Vsync以固定的频率产生,不受软件的影响(只要有电就会产生)。...这个固定的频率叫做屏幕刷新频率(refresh rate或者Scanning Frequency)。通常情况下,这个频率是60hz。也就是1/60s == 16.666ms就会产生一个垂直同步信号。...为什么我的游戏会出现画面撕裂 可能你还会问,为什么我的显卡和显示器配置都很高,玩游戏时还是会存在画面撕裂的现象呢?...渲染到屏幕上还需要对二进制数据进行解码,而这个解码过程往往是在主线程中执行的。...task.didDisplay) task.didDisplay(self, YES); } }); }); } 后续结合代码和效果图补充一些

9.6K73
  • 《DRM 专栏》| LCD显示异常分析——花屏和撕裂

    花屏 概述 相信很多朋友遇到LCD开机瞬间闪现雪花屏的问题,而这类问题都有个共同点,那就是都发生在带GRAM的屏上,同样的问题,在休眠唤醒时也会出现。...常白屏引起的撕裂假象 上面的问题如果发生在常白屏(即默认上电就是白屏)上,那么往往会给人产生撕裂(tear effect)的假象,见下图: 其实原理和上面是类似的,只是由于人的视觉残留效应,造成背光从灭到亮那一瞬间看到的第一帧印象极为深刻...尤其对于帧率较低(如30fps)的显示屏,视觉残留效果尤为明显,因此会对该类问题错误的判断为撕裂问题而进行处理。...即必须保证W:R > 1:2(这里的W、R都指的是速率),否则势必会出现撕裂的现象(如上面的W:R=1:3)。 理想情况 为什么是2倍?...所以W:R=1:2是撕裂发生的临界值。 同理,那如果对于W > R的情况,是否也存在这个2倍关系?

    3.4K20

    Android 显示刷新机制、VSYNC和三重缓存机制

    上文中,我们已经知道了什么事画面撕裂(Tearing)现象以及它产生的原因,而 VSYNC 最重要的作用是防止出现画面撕裂。...VSYNC 信号表明可对屏幕进行刷新而不会产生撕裂。当 SurfaceFlinger 接收到 VSYNC 信号后,SurfaceFlinger 遍历其层列表,以查找新的缓冲区。...以上是使用双重缓存机制时产生的问题,那么又如何来解决呢? 为了解决这个问题,Android 引入了 Triple Buffer 机制。...引入 Triple Buffer 效果如下图所示: 上图中,第二个 16ms 时间段,CPU 使用 C Buffer 绘图。虽然还是多显示 A 帧一次,但后续显示就比较顺畅了。...VSYNC 信号表明可对屏幕进行刷新而不会产生撕裂。 使用 VSYNC 信号机制,提升了渲染任务的优先级,优化了渲染性能,可有效的减少了丢帧、卡顿等问题。

    2.4K20

    Android VSYNC与图形系统中的撕裂、双缓冲、三缓冲浅析

    屏幕刷新率一般是固定的,比如60Hz的每16ms就刷一次屏幕,可以类比一下黑白电视的电子扫描枪,每16ms电子枪从上到下从左到右一行一行逐渐把图片绘制出来,如果GPU显卡性能非常强悍,帧率可以非常高,甚至高于屏幕刷新频率...双缓冲的进阶:三缓冲 在Android系统里,除了双缓冲,还有个三缓冲,不过这个三缓冲是对于屏幕硬件刷新之外而言,它关注的是整个Android图形系统的消费者模型,跟Android自身的VSYNC用法有关系...,在 Jelly Bean 中Android扩大了VSYNC使用场景与效果,不仅用在屏幕刷新防撕裂,同时也用在APP端绘制及SurfaceFlinger合成那,此时对VSYNC利用有点像Pipeline...双缓冲jank 可以看到在第二个阶段,存在CPU资源浪费,为什么呢?...一般出现这种场景都是连续的:比如复杂视觉效果每一帧可能需要20ms(CPU 8ms +GPU 12ms),GPU可能一直超负荷,CPU跟GPU一直抢Buffer,这样带来的问题就是滚雪球似的掉帧,一直浪费

    2.3K30

    Java中的JList和DefaultListModel的亲密关系

    这个事件处理过程中,又将鼠标的操作分为2种状态 按下鼠标不松手,在各个元素间拖动 松开鼠标 即,当你按下鼠标后,触发一个事件,拖动到另一个控件,又触发一个事件,继续拖动则继续触发事件,最后松手,触发一个事件...DefaultListModel 类 用一个特别的类来构造JList,也就是DefaultListModel类,然后对这个类的内容添加或者减少,那么JList很快的做出响应。...为什么这个这么神奇呢? 他继承自AbstractListModel类,内部用一个Vector来存储数据 ? 在它的添加元素方法中 ?...,这个对象就是一个Cell。...一般来讲,我们都是用一个JPanel作为绘制Cell的对象,因为在JPanel上显示文字和图像都是很方便的。

    1K41

    显示撕裂、掉帧的原因以及苹果的处理方案显示撕裂、掉帧的原因以及苹果的处理方案

    显示撕裂、掉帧的原因以及苹果的处理方案 本文阅读时间大约5分钟 前言 依旧还是老规矩,提出几个问题,希望看完本文后可以完美的回答: 屏幕撕裂罪魁祸首是谁?如何解决?...屏幕撕裂 这个问题大家应该都遇到过,尤其喜欢玩游戏的同学更加常见,先上一张我的女神,无视上面的字是在找不到其他的了.... ? 先说一些自己最直观的认知:这是两张图片拼接成的。...可是在一个时刻为什么会出现两张图片呢?这就要从这张图片是如何渲染到屏幕上说起了。 计算机显示流程 ?...现实状态 cpu、gpu的处理是根据位图的复杂程度决定的,导致这个处理时间或长或短。所以控制器读取的内容就会提前或者延后,而帧缓存区内容就会异常导致屏幕出现撕裂。对照屏幕扫描这个概念一起理解。...目前苹果大大使用三缓存区的方案来进一步减少掉帧的出现,因为缓存区越多cpu、gpu的利用率就越高,出现卡顿的频率也越少。 后序 相信在科学技术、硬件技术的发展下,这个问题可以得到完美的解决。

    1.5K10

    openGL之API学习(六十九)水平同步 垂直同步「建议收藏」

    垂直和水平是CRT中两个基本的同步信号,水平同步信号决定了CRT画出一条横越屏幕线的时间,垂直同步信号决定了CRT从屏幕顶部画到底部,再返回原始位置的时间,而恰恰是垂直同步代表着CRT显示器的刷新率水平...你觉得原来移动时的游戏画面是如此舒服,如果达不到会出现不同程度的跳帧现象,FPS与刷新率差距越大跳帧越严重(为什么?)。关闭后除高速运动的游戏外其他游戏基本看不出画面撕裂现象。...目前市面上的显示器的刷新率大多数都是60hz,而60hz的意思就是这个显示器每秒钟显示60幅画面,但如果显卡的画图的速度超过了显示器每秒钟显示画面的速度怎么样呢?...当我们玩游戏的时遇到了画面撕裂的情况,开启垂直同步就是解决这个问题的办法。...理论上来说画面撕裂和画面延迟是无论如何都要付出一个的,但实际情况是很多优秀游戏已经做到了不管你开不开垂直同步,都不会产生太大延迟或者画面撕裂严重。

    1.3K20

    Java进阶09 事件响应

    有一些事件(Event)可能发生在这些图形元素上,比如: 点击按钮 拖动滚动条 选择菜单 Java中的事件使用对象表示,比如ActionEvent。每个事件有作用的图形对象,比如按钮,滚动条,菜单。...所谓互动的GUI,是指当上面事件发生时,会有相应的动作产生,比如: 改变颜色 改变窗口内容 弹出菜单 每个动作都针对一个事件。...(这个例子改编自Core Java 2,Volume 1, Example 8-1) import javax.swing.*; import java.awt.event.*; import java.awt...ActionEvent是一个高层的类,Java找到图形对象(按钮)会发生的典型事件(点击)作为事件。 ColorAction生成的对象即为监听器对象。...当有事件发生时,对应动作将随之产生。 总结 ActionListener interface ActionEvent class

    1.2K80

    为什么那么多公司钟爱 Flutter ?

    ▐ 4.2 帧率与刷新率 1、基础知识 帧率【fps】:Frame Per Second 刷新率:显示器的频率,比如 iPhone 的 60HZ 等 拓展: 我们为什么能看到类似于动画的效果呢?...工作流程: 在某个时间点,一个屏幕刷新周期完成,VSync 信号产生,先完成复制操作,然后通知 CPU/GPU 绘制下一帧图像。...复制操作完成后屏幕开始下一个刷新周期,即将刚复制到 Frame Buffer 的数据显示到屏幕上。 在这种模型下,只有当 VSync 信号产生时,CPU/GPU 才会开始绘制。...2、存在的问题 双重缓存的缺陷在于:当 CPU/GPU 绘制一帧的时间过长(比如超过 16ms)时,产生 Jank(画面停顿,甚至空白)。...CPU 生成蓝色 B 的数据,由 GPU 进行 B 的绘制,但是这个过长由于过长,那么第二个A就产生了 Jank。

    1.9K20

    iOS 渲染原理解析

    Pixel 像素处理阶段:处理像素,得到位图 经过上述光栅化阶段,我们得到了图元所对应的像素,此时,我们需要给这些像素填充颜色和效果。所以最后这个阶段就是给像素填充正确的内容,最终显示在屏幕上。...但这种完美的情况是非常脆弱的,很容易产生屏幕撕裂: [17274317f2b18684?w=455&h=255&f=png&s=181750] CPU+GPU 的渲染流程是一个非常耗时的过程。...w=530&h=170&f=png&s=27843] 掉帧 Jank 启用 Vsync 信号以及双缓冲机制之后,能够解决屏幕撕裂的问题,但是引入新的问题:掉帧。...为什么使用离屏渲染 那么为什么要使用离屏渲染呢?主要是因为下面这两种原因: 一些特殊效果需要使用额外的 Offscreen Buffer 来保存渲染的中间状态,所以不得不使用离屏渲染。...Screen Tearing 屏幕撕裂是怎么造成的? 如何解决屏幕撕裂的问题? 掉帧是怎么产生的? CoreAnimation 的职责是什么? UIView 和 CALayer 是什么关系?

    2.1K50

    VRR的工作流程及G-sync和Freesync的区别

    并且显卡是全程在不断的更新画面的,画面不存在滞后的现象,几乎不会产生延迟,这个便是理想状态的G-sync和Freesync,但是如果帧率高于显示器的刷新率,由于显示器进行一次逐行扫描的时间是不变的,144hz...所以和只能解决帧数低于刷新率的撕裂现象,当帧数超过显示器的刷新率的时候,画面还是撕裂。...那么问题来了,既然你都能保证帧率非常稳定了,大部分画面撕裂无限接近屏幕的上下边框,几乎不可能被你察觉,此时你还需要VRR干什么呢?直接手动锁帧上限等于刷新率不就可以了吗。...因此我个人的观点大家在选购显示器的时候,不需要去纠结显示器有没有或者技术,在当前的硬件技术面前,能产生效果非常有限,画面的卡顿撕裂延迟,这三者你不可能同时完美兼顾,必然是有所取舍的,这三者能取舍多少以及更加侧重哪一边...而上面我们已经讲过了,无论是G-sync还是Freesync,都是通过调整VBlank来完成自适应刷新率的,也就是说,它们的工作原理和实现的效果是相同的,所以说到了今天这个节点上来看,G-sync仅仅只是说买一个

    3K30

    Android 垂直同步和三重缓冲

    屏幕刷新率是屏幕在每秒钟能刷新的次数,单位是赫兹(Hz),这取决于显示器的硬件配置。...在最初屏幕读取缓冲区只有一个,当界面还没有渲染完毕时,GPU 已经将下一帧的界面栅格化,帧率和刷新频率不同且没有垂直同步这样造成画面撕裂的情况,因为只有一个缓冲区,上部分已经显示下一帧,而下部分是上一帧...Buffer,GPU 定时对 Frame Buffer 和 Back Buffer 进行处理,Back Buffer 也并不一定是必然存在的,首先它是因为屏幕刷新率和帧率不同步造成的,当二者不同时,...为了避免屏幕撕裂这个时候才会创建 Back Buffer,但是二重缓冲还是有问题,举例说明如果主线程要处理的东西比较多,导致 CPU/GPU 完成一帧用了26毫秒,那么垂直同步机制的回调在本该在16毫秒的刷新是无效的...,因为当前的缓冲区还是上一帧的数据,因为当前帧的数据还没有计算完毕并写入缓冲区,,产生 Jank也就是丢帧,同时在20毫秒至32毫秒这段时间,CPU/GPU 是闲置的。

    1.3K30

    Java-GUI编程之Swing组件

    getPanelWithBorder(Border border,String borderName){ JPanel jPanel = new JPanel();...JToolBar工具条添加对应的工具按钮 addSeparator( Dimension size ) 向工具条中添加指定大小的分隔符 setFloatable( boolean b ) 设定工具条是否可以被拖动...,为什么呢,之前说过,Action接口是ActionListener的一个子接口,那么它就代表一个事件监听器,而这里add方法是在给工具条添加一个工具按钮,为什么传递的是一个事件监听器呢? ​...pauseBtn = new JButton(pause); JButton nextBtn = new JButton(next); // 往工具条中添加Action对象,该对象转换成工具按钮...对 showConfirmDialog 所产生的对话框,有如下几个返回值: YES OPTION: 用户 单击了 "是"按钮后返回 。 NO OPTION: 用 户单击了"否"按钮后返回 。

    2.3K20

    翻译:VESA Adaptive-Sync AMD FreeSync VRR 白皮书

    当显示的刷新率与图像自身内容的帧率不同步时,用户可能察觉到撕裂(tearing)和卡顿(stutter)之类的异常效果。...这种帧率的变化通常会让玩家在选择屏幕刷新方式时进行权衡,比如在他们的设置程序中开启“VSync”同步功能。...这对于游戏渲染帧率高于显示刷新率的情况来说,效果非常好。...Embedded DisplayPort (eDP)接口早已具备支持该技术的能力,例如,当系统进入静态画面显示状态时(即屏幕上没有新的内容更新),显示器的刷新率降低到它所能支持的最低频率,以此来节省功耗...实现方案简介 AMD 的 Project FreeSync 实现方案需要在每帧的基础上调整 VBLANK 持续时间,以此来改变所产生的帧周期,进而改变刷新率。

    2K20

    又卡了~从王者荣耀看Android屏幕刷新机制

    “卡”的意思 不管是端游还是手游,我们都会时不时遇到“卡”的时候,一般这个卡有两种含义: 掉帧 ? 画面撕裂 ? 那么问题来了,这些情况到底是什么原因导致的?又该怎么解决?...也就是我们常说的Android系统中,每隔16.6ms刷新一次屏幕。 关于屏幕刷新机制,有一张很经典的图片: ?...比如有时候手机卡的时候,我们去操作App,操作延迟,就是掉帧了。这种情况帧并不是真的掉了,而是延迟了。 画面撕裂 接下来就看看画面撕裂为什么一帧中会出现两帧的画面呢?...之前说了屏幕的数据是从缓存区Buffer中取的,如果在屏幕取数据并逐行扫描显示画面的过程中,Buffer中的数据变了,那么就有可能导致画面撕裂。...也就是显卡一秒钟能产生180张画面,而显示器一秒钟只能读取60张画面。

    90040

    华为和小米:在智能电视市场的边缘疯狂试探

    有趣的是,其后,酷开召开“宅趣横生”线上发布,发布了酷开声控智慧屏P50系列的75寸版本,以4000元以下的价格定位再次挑战市场神经,被业内认为似有阻击小米之意。...面对不同的消费群体,大屏市场的“撕裂”逐步在价格定位层面拉开差距,这个趋势进入2020年后已然成为一个品牌的战略趋势。 其中的思路也不难理解。...、屏幕工艺等等。...但是,从另一方面来说,当我们把目光从大屏产品的链接属性转移到交互功能,另一个有意思的“撕裂状态”又将呈现——目前,几乎所有的厂商都在人机交互上下苦功夫,将用户与屏幕的距离不断拉开。...智能电视虽是在传统彩电上的创新,但是当各大厂商纷纷提出全新的定义,以“智慧屏”、“智屏”等概念输出市场,这个产品已然需要面临“撕裂”式的重生。

    35420
    领券