使用 .setPaint(gradient) 调整大小时不重新绘制

2023-11-29

一旦我在代码中使用渐变,在调整大小时重新绘制就不会完成,我在调整大小时会得到类似的结果(已调整大小的黑色矩形,请参阅下面链接中的图像)。当我停止调整大小时,所有内容都会再次绘制,但只有那时。

如果我不使用g2d.setPaint(gradient);我有一个快速重画

http://gui-builder.com/C41142775162.rar

public void paintComponent(Graphics g)  
{  

        super.paintComponent(g);  

        Graphics2D g2d = (Graphics2D)g;  

        //sample of the code  
        GradientPaint gradient = new GradientPaint(startX, startY, greyColor1, endX, endY, new Color(120,120,120));  
        g2d.setPaint(gradient);  
        g.drawLine(i, startY, i, endY);  
}  

我尝试过了repaint()在调整大小时,我尝试repaint()当鼠标被拖动但没有任何反应时。


这是一些 SSCCE(抱歉我之前没有发布):

缓冲图像aa;

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

        Graphics gr = aa.getGraphics();  
        Graphics2D g2d = (Graphics2D)gr;  

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,  
                    RenderingHints.VALUE_ANTIALIAS_ON);  


        for (int i = 0; i < this.getWidth(); i++)  
        {  
            LinearGradientPaint lgp = new LinearGradientPaint(
            new Point2D.Float(0, 0),
            new Point2D.Float(0, this.getHeight()),
            new float[] {0f, 0.5f, 1f},
            new Color[] {Color.BLUE, Color.RED, Color.BLUE}
            ); 
            g2d.setPaint(lgp);  
            gr.drawLine(i, 0, i, this.getHeight());  
        }  
        g.drawImage(aa, 0, 0, frame);  
}  

在你的构造函数中:

aa = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);

我仍然需要一个答案,为什么当我调整窗口大小时重绘没有完成(当我移动窗口的调整大小角时)


好吧,总结一下: 我尝试了Java中绘图的三种主要方法,即BufferStrategy、双Swing缓冲图像和无图像缓冲区的简单Swing。 我发现最快的是最后一个(令人惊讶)。

现在我使用的是快速的,我发现首先将窗口大小调整为小尺寸,然后将窗口大小调整为大尺寸可以使问题消失。别笑,这是我的问题,这完全是个谜。 这是它的视频:C41142775162.rar

当我调整为小尺寸时会发生什么?我不知道。但如果您知道任何帮助将不胜感激。

thanks

Jeff


我还发现最好尽可能少地使用 setPaint 。您可以运行测试,您会发现不经常使用 setPaint() 会更快。例如,不要使用:

LinearGradientPaint gradient1 = new LinearGradientPaint(
        new Point2D.Float(0, 0),
        new Point2D.Float(0, 10),
        new float[] {0f, 1f},
        new Color[] {new Color(40,40,40), new Color(110,110,110)}
    );
LinearGradientPaint gradient2 = new LinearGradientPaint(
        new Point2D.Float(0, 10),
        new Point2D.Float(0, 20),
        new float[] {0f, 1f},
        new Color[] {new Color(110,110,110), new Color(190,190,190)}
    );
LinearGradientPaint gradient3 = new LinearGradientPaint(
        new Point2D.Float(0, 20),
        new Point2D.Float(0, 30),
        new float[] {0f, 1f},
        new Color[] {new Color(190,190,190), new Color(250,250,250)}
    );                        
for (int i = 0; i < this.getWidth(); i++)
{
    g2d.setPaint(gradient1);
    gr.drawLine(i, 0, i, 10);
    g2d.setPaint(gradient2);
    gr.drawLine(i, 10, i, 20);
    g2d.setPaint(gradient3);
    gr.drawLine(i, 20, i, 30);                            
}

use :

LinearGradientPaint gradient1 = new LinearGradientPaint(
        new Point2D.Float(0, 0),
        new Point2D.Float(0, 10),
        new float[] {0f, 1f},
        new Color[] {new Color(40,40,40), new Color(110,110,110)}
    );
LinearGradientPaint gradient2 = new LinearGradientPaint(
        new Point2D.Float(0, 10),
        new Point2D.Float(0, 20),
        new float[] {0f, 1f},
        new Color[] {new Color(110,110,110), new Color(190,190,190)}
    );
LinearGradientPaint gradient3 = new LinearGradientPaint(
        new Point2D.Float(0, 20),
        new Point2D.Float(0, 30),
        new float[] {0f, 1f},
        new Color[] {new Color(190,190,190), new Color(250,250,250)}
    );                         

g2d.setPaint(gradient1);
for (int i = 0; i < this.getWidth(); i++)
     gr.drawLine(i, 0, i, 10);

g2d.setPaint(gradient2);
for (int i = 0; i < this.getWidth(); i++)
    gr.drawLine(i, 10, i, 20);

g2d.setPaint(gradient3);
for (int i = 0; i < this.getWidth(); i++)
    gr.drawLine(i, 20, i, 30); 

即使你有很多计算,它几乎每次都会更快!


我做了一个测试,发现GradientPaint表现不佳。将 1.2 秒(400x400 像素)的平均渲染时间缩短为 20 秒以上。

我改变了GradientPaint for a LinearGradientPaint发现渲染时间约为 1.3 秒。

LinearGradientPaint lgp = new LinearGradientPaint(
                new Point2D.Float(0, minY),
                new Point2D.Float(0, maxY),
                new float[] {0f, 0.5f, 1f},
                new Color[] {Color.BLUE, Color.RED, Color.BLUE}
                );
g2d.setPaint(lgp);
    // Render all your samples, don't reapply or change you paint...

抱歉,我的样本不太令人兴奋......

enter image description here

您可能会发现最好渲染到后台线程中的后备缓冲区,并在完成后将整个图像绘制到屏幕上。这将阻止屏幕“暂停”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 .setPaint(gradient) 调整大小时不重新绘制 的相关文章

  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • 在 Identity 2.0 中扩展 IdentityUserRole

    因此 我的系统要求角色具有关联的到期日期 我已经实现了 Identity 2 0 框架 一切进展顺利 但我遇到了一个问题 让我怀疑我的结构 public class ApplicationUserRole IdentityUserRole
  • 如何防止ListView扩大窗口尺寸?

    我将 ListView 放在 View 的中间行 该视图包含在 SizeToContent 设置为 WidthAndHeight 的窗口中 ListView 最初是空的 但底层 ViewModel 在此过程中填充了此列表视图 中间的 Gri
  • 使用 Julia 和 gurobi 进行二次约束 MIQP

    这是试图回答以下问题 https matheducators stackexchange com questions 11757 small data sets with integral sample standard deviation
  • 函数参数传递和返回

    var foo bar function return this baz baz 1 function return typeof arguments 0 foo bar 为什么这段代码会返回undefined 我会假设arguments
  • 如何将 MOVE 用于以记录为元素且其上有动态数组字段的动态数组?

    我正在使用 Delphi Rio 我的程序有很多动态数组操作 为了提高一些长数组复制的速度 我尝试使用 Move 对于基本类型 实数 整数 的一维动态数组 我可以管理 Move 的使用 但对于以记录作为其元素的动态数组 并且该记录具有另一个
  • Python根据条件分割字符串

    如果逗号前面有某个正则表达式 我想使用逗号分隔符分割字符串 考虑我的字符串格式如下的情况 一堆可能有逗号的东西 FOO REGEX 其他可能有逗号的东西 FOO REGEX 我想用逗号分割字符串 但前提是它们前面有 FOO REGEX 一堆
  • 使用 ContentFlow (coverflow) 显示数据库图像 IllegalStateException 错误

    我目前正在使用第三方图像 coverflow http www jacksasylum eu ContentFlow 来显示保存在数据库中的图像 为此 我使用 Java JPA 和 Richfaces 我已经设置了一个图像 servlet
  • 添加 Excel 格式的最有效方法 - VBA

    我有一个宏 可以将数百行数据添加到 Excel 电子表格中 我从插入每行数据的循环中调用一个过程 每次插入该数据时 我都会应用该行的格式 然而 在测试过程中 我发现当我不逐行应用格式而是一次全部应用格式时 插入所有数据的速度可以快大约 3
  • 在Python OpenCV中访问IP摄像头

    如何访问我的网络摄像机流 显示标准网络摄像头流的代码是 import cv2 import numpy as np cap cv2 VideoCapture 0 while True ret frame cap read cv2 imsho
  • 当具体类包含其他接口时如何反序列化接口集合

    我目前面临的情况是 我得到了一个无法修改的 json 文件 并且我希望生成的反序列化类对于设计目的是通用的 首先是我的界面 public interface IJobModel string ClientBaseURL get set st
  • Git 合并混乱。 diff 显示差异,merge 表示没有差异

    我开始学习使用git 我遇到了一个我不明白的情况 存储库被从svn中取出 我在树枝上jacob 379尽一切努力 host git status On branch jacob 379 nothing to commit working d
  • 如何将“expo-splash-screen”与“expo-google-fonts”一起使用?

    初始屏幕使用异步操作等待 而字体包使用 自定义挂钩 useFonts 我猜 如何让启动屏幕等待谷歌字体加载 您可以使用以下方式加载字体loadAsync from expo fonts 并管理启动画面expo splash screen i
  • Drupal 7 术语路径在哪里?

    使用 Drupal 6 中的 pathauto 和 token 模块 您可以使用如下模式创建 url 别名 termpath raw title raw 然而 Drupal 7 中的情况并非如此 我知道 D7 仍处于 alpha 阶段 但
  • Junit @Rule 如何工作?

    我想为大量代码编写测试用例 我想了解JUnit的详细信息 Rule注释功能 以便我可以使用它来编写测试用例 请提供一些好的答案或链接 通过一个简单的示例详细描述其功能 规则用于添加适用于测试类中的所有测试的附加功能 但以更通用的方式 例如
  • 无法解析 XML blob

    我在对 azure 上的 dbs 进行身份验证时遇到问题 所有详细信息都是正确的 但是当我单击 连接 时 出现以下错误 TITLE Microsoft SQL Server Management Studio Error connectin
  • 单行检查列表中至少一项是否存在于另一个列表中? [复制]

    这个问题在这里已经有答案了 假设我有一个清单a 1 2 3 我想知道其中至少有一个数字是否存在于另一个列表中 如下所示 b 4 5 6 7 8 1 换句话说 我想知道列表中是否存在 1 2 或 3b 我现在可以做类似的事情 def func
  • 如何用Python实现一个最小的AJAX服务器?

    我想为 Python 程序创建一个非常简单的基于 HTML AJAX 的 GUI 所以前端是一个 HTML 页面 通过 AJAX 与程序进行通信 你能给我一个使用 python 的服务器端的最小实现吗SimpleHTTPServer Sim
  • 旋转 UIImage 并移动

    我已经搜索了堆栈溢出太多次 也发布了一个问题 但没有成功 我需要在我的拼贴应用程序中实现一个功能 用户可以旋转 uiimage 并将其作为旋转图像移动 知道如何做吗 如果需要 我会尝试所有这些 最近两天寻找它感到沮丧 首先 我使用 CGAf
  • 如何获取前台窗口的exe路径

    我想获取活动前台窗口的可执行文件的路径 我已经有了前台窗口的处理程序 DllImport user32 dll static extern IntPtr GetForegroundWindow IntPtr handlerAppActual
  • 使用 .setPaint(gradient) 调整大小时不重新绘制

    一旦我在代码中使用渐变 在调整大小时重新绘制就不会完成 我在调整大小时会得到类似的结果 已调整大小的黑色矩形 请参阅下面链接中的图像 当我停止调整大小时 所有内容都会再次绘制 但只有那时 如果我不使用g2d setPaint gradien