3

当我将 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 有效?

4

1 回答 1

4

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

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

Swing 期望一个组件是:

  1. opaque - 这意味着组件将在进行自定义绘制之前首先使用不透明颜色重新绘制整个背景,或者
  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

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

或者,您可以查看具有透明度的背景以获取自定义类,该类可用于为您完成上述工作的任何组件。

于 2013-07-19T17:03:27.367 回答