gpt4 book ai didi

java - 更改 JButtons 背景的最佳方法

转载 作者:行者123 更新时间:2023-12-02 06:12:55 26 4
gpt4 key购买 nike

现在我使用

更改按钮的背景颜色
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)。

这对于频繁更新来说仍然太慢,因此如果您有以下情况,最好使用绘制网格的自定义组件或flyweight容器(trashgod在您问题的评论中建议的内容)您希望允许网格单元是任意组件。

关于java - 更改 JButtons 背景的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6117908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com