【问题标题】:Faulty repaint() of swing components when using custom background colors使用自定义背景颜色时摇摆组件的错误 repaint()
【发布时间】:2013-07-19 01:30:10
【问题描述】:

当我将 JCheckboxes 或 JScrollPane(应用于包含所有其他组件以生成可滚动窗口的主组件)与使用

的组件一起使用时
component.setBackground(new Color(R, G, B, A));

为了定义它们的背景颜色,我遇到了一些令人讨厌的 repaint() 问题。将鼠标悬停在 JCheckboxes 上会激活 MouseListener 并且 JCheckbox 的背景会突然显示窗口的随机其他部分。即使将鼠标从 JCheckbox 上移开,这种情况仍然存在。

使用时问题消失

JCheckbox.setRollOverEnabled(false);

选择复选框时仍然会出现!

滚动窗格也不会正确地重新绘制。只有在可见框架之外的部分,当它们返回到框架中时,将在滚动方向上连续绘制几次。当程序崩溃时,它看起来类似于 Windows 操作系统上的错误,您可以在屏幕上“绘制”窗口,因为每次移动它时它都会“生成”一个新窗口 (http://i.stack.imgur.com/L5G5Q.png)。

最有趣的部分是当我使用时问题完全消失了

Color.grey (or any other pre-generated color)

当根本不选择自定义背景颜色时它也会消失。

那么 revalidate() 和 repaint() 隐藏在其中的任何地方是否存在问题?使用 RGBA 是否有问题,特别是 A(= 不透明度)部分,因为 Color.AnyColor 有效?

【问题讨论】:

    标签: java swing colors repaint jcheckbox


    【解决方案1】:

    RGBA 的使用有问题吗,特别是 A(= 不透明度)部分

    是的,Swing 不支持透明背景。

    Swing 期望组件是:

    1. 不透明 - 这意味着组件将在进行自定义绘制之前先使用不透明颜色重新绘制整个背景,或者
    2. 完全透明 - 在这种情况下,Swing 将首先绘制第一个不透明父组件的背景,然后再进行自定义绘制。

    setOpaque(...) 方法用于控制组件的 opaque 属性。

    在任何一种情况下,这都可以确保移除任何绘画工件,并且可以正确完成自定义绘画。

    如果你想使用透明,那么你需要自己做自定义绘画,以确保背景被清除。

    面板的自定义绘画将是:

    JPanel panel = new JPanel()
    {
        protected void paintComponent(Graphics g)
        {
            g.setColor( getBackground() );
            g.fillRect(0, 0, getWidth(), getHeight());
            super.paintComponent(g);
        }
    };
    panel.setOpaque(false); // background of parent will be painted first
    

    每个使用透明度的组件都需要类似的代码。

    或者,您可以查看Background With Transparency 的自定义类,该类可用于为您完成上述工作的任何组件。

    【讨论】:

    • 非常感谢!就在我检查你的答案之前,我也可以确认它。将不透明度设置为最大值 (255) 将完全解决此问题。
    猜你喜欢
    • 2010-09-17
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多