更改 JButtons 背景的最佳方法

2024-02-16

现在我使用以下方法更改按钮的背景颜色

button.setBackground(Color.WHITE);

这是一个例子。

但是当我有一个巨大的 jbuttons 网格(1000+)时,仅仅运行一个 for 循环来改变每个按钮的背景是非常非常慢的。您可以看到网格逐个框慢慢变白。我真的不想要这个

有没有更好的方法同时将网格上的每个 JButton 更改为相同的颜色?

这就是我制作网格的方式,所使用的数字仅作为示例......

grid = new JPanel(new GridLayout(64, 64, 0, 0));

共有 4096 个按钮,大约需要 30 秒以上才能将每个按钮更改为相同的颜色。

编辑1:我需要按钮是可点击的,例如当我点击按钮时它会变成蓝色。单击所有按钮后,将每个按钮的颜色更改为白色。现在我的工作正常,但改变每个按钮的颜色很慢。

编辑2:这就是我更改按钮的方式:

    new javax.swing.Timer(300, new ActionListener() {
        int counter = 0;
        public void actionPerformed(ActionEvent e) {
            if (counter >= counterMax) {
                ((Timer) e.getSource()).stop();
            }
            Color bckgrndColor = (counter % 2 == 0) ? flashColor : Color.white;
            for (JButton button : gridButton) {
                button.setBackground(bckgrndColor);
            }
            counter++;
        }
    }).start();

事实上你看到盒子被重新粉刷单独地指示双缓冲已关闭,或者按钮 UI 中的绘制代码使用paintImmediately().

我使用 64x64 JButtons 测试了您的设置,并确保所有 UI 操作都在 EDT(事件调度线程)中执行。我可以确认您看到的效果,更改所有按钮的背景大约需要 1200 毫秒,每个框都会立即重新绘制。 您可以通过将网格设置为之前不可见并在更改背景后设置为可见来绕过立即重新绘制:

grid.setVisible(false);
for (Component comp : grid.getComponents()) {
   comp.setBackground(color);
}
grid.setVisible(true);

这导致网格只进行一次重绘,并将时间减少到约 300 毫秒(因子 4)。

对于频繁更新来说这仍然太慢,所以你最好使用绘制网格的自定义组件,或者一个蝇量容器(trashgod 在你的问题的评论中建议的)如果你想允许网格单元是任意组件。

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

更改 JButtons 背景的最佳方法 的相关文章

随机推荐

  • 调用android中隐藏的API来关闭屏幕

    我正在考虑使用隐藏的 api 来关闭我的应用程序中的屏幕 setScreenState from https android googlesource com platform frameworks base eclair release
  • 是否有适用于 iPhone、Android 和 Windows Phone 7 的增强现实框架?

    我想开发一个在 iPhone Android Windows Phone 7 智能手机上运行的应用程序 能够识别标记并在其上放置增强现实内容 我可以使用任何通用框架来完成该任务吗 这可能是您得到的最接近的结果 http nyatla jp
  • ASP.NET WebApi 中异步调用的本地化

    嗨 我计划基于 Accept Language 标头 通过基于该标头设置 CurrentUICulture 来处理错误字符串等的服务器端本地化 但显然它不会通过异步调用 下面是示例代码来说明问题 是否有处理异步调用本地化的默认方法 publ
  • 如何查找指向 Oracle 中一条记录的外键依赖关系?

    我有一个非常大的 Oracle 数据库 有很多表和数百万行 我需要删除其中之一 但希望确保删除它不会破坏任何其他指向它作为外键记录的依赖行 有没有办法获取指向该行的所有其他记录的列表 或者至少是表模式 我知道我可以尝试自己删除它并捕获异常
  • 每行上的模态按钮显示从数据库获取详细信息的模态

    我已经使用表从两个表中获取所有记录 效果很好 我在显示的每一行末尾添加了一个按钮Modal 在此模式中 我想根据每个行 ID 显示数据 我的代码有一个 while 循环 它显示表中的记录 在该 while 循环中 我又编写了一个 sql 语
  • 如何在使用 XMLHttpRequest() 时在 python 中接收 POST 数据

    我有两个关于使用 XMLHttpRequest 时接收数据的问题 客户端是用javascript编写的 服务器端是用python写的 如何在 python 端接收 处理数据 如何响应 HTTP 请求 客户端 var http new XML
  • powershell - 使用文件名列表删除文件

    我从堆栈溢出中得到了以下代码 它工作正常 TargetFolder Pathofyourfolder Files Get ChildItem TargetFolder Exclude gc List txt Recurse foreach
  • 使用 AJAX 观察 SQL 数据库的更改 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的数据库中有一个列将随机更新 每当该列更新时 我都需要刷新页面上的内容 如何使用 AJAX jQuery 仅对数据库更改执行操作 你
  • 错误您已经拥有该商品

    我有一个新的 Android 应用程序 其中添加了应用程序内计费功能 我感到沮丧得抓狂 我已上传签名的 APK 并发布到 alpha 我创建了一组应用内产品并将其全部激活 我创建了一个新的 Gmail 帐户 并将其定义为应用程序 apk 页
  • Java 中的架构约束 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想确保我的项目不包含包之间不必要的依赖关系 例如 我想确保该项目具有分层结构 IE 模型低于一切 业务
  • 从 HDC 句柄创建 QPaintDevice

    我有一个来自外部库的 Windows HDC 句柄 我想使用 QPainter 功能来绘图 Qt 中有什么方法可以从 HDC 句柄创建 QPaintDevice 吗 这样做的一种方法 使用 Windows API 从 HDC 获取 HWND
  • 使用 jQuery 操作 TinyMCE 内容

    使用 TinyMCE 我可以轻松操作内容并将其发送回编辑器 如下所示 get content from tinyMCE var content tinyMCE get content getContent manipulate conten
  • 使用 NSMutableString 追加到文件末尾

    我有一个日志文件 我试图将数据附加到其末尾 我有一个NSMutableString textToWrite变量 我正在执行以下操作 textToWrite writeToFile filepath atomically YES encodi
  • 从 ASP.NET MVC2 升级到 MVC3 的原因 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用此关键字并揭示模块模式的严格违规

    无法让以下内容通过 jslint jshint jshint strict true var myModule function use strict var privVar true pubVar false function privF
  • MFC/WinAPI 的大问题

    我需要创建一个带有两个选项卡的表单视图的 SDI 表单 其中封装了多个对话框作为选项卡内容 但表格必须有彩色背景 诸如此类的事情让我讨厌编程 首先 我通过资源编辑器尝试了 CTabControl 尝试了不同的事情 但未记录的行为和没有答案的
  • 使用多个自定义表模型避免重复代码

    我正在从事一个项目 其中我们有几个领域类来对业务数据进行建模 这些类是简单的 POJO 我必须使用它们来显示几个表 例如 考虑这个类 public class Customer private Long id private Date en
  • IntelliJ 中的“用 try...catch 换行”?

    我可以选择一段代码并让 IntelliJ 用 try catch 将其包装起来吗 有键盘快捷键吗 选择代码 然后 Choose Code gt Surround With 按 Ctrl Alt T 对于 OS X 命令 选项 T 有时我喜欢
  • 如何修复 Mountain Lion 中的 VIM 系统剪贴板使用问题

    set clipboard unnamed是我最喜欢的之一 vimrc配置 多亏了它 猛拉和删除被复制到我的系统剪贴板 我可以轻松地将它们粘贴到其他应用程序 然而 当我升级到 Mountain Lion 时 这个设置就崩溃了 你知道如何解决
  • 更改 JButtons 背景的最佳方法

    现在我使用以下方法更改按钮的背景颜色 button setBackground Color WHITE 这是一个例子 但是当我有一个巨大的 jbuttons 网格 1000 时 仅仅运行一个 for 循环来改变每个按钮的背景是非常非常慢的