有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用自定义背景色时,swing组件的java错误重绘()

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

component.setBackground(new Color(R, G, B, A));

为了定义它们的背景色,我遇到了一些令人讨厌的重绘问题。将鼠标悬停在JCheckbox上会激活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(=不透明度)部分的颜色。任何颜色都有用吗


共 (1) 个答案

  1. # 1 楼答案

    Is the use of RGBA a problem, specifically the A (= opacity) part

    是的,Swing不支持透明背景

    Swing希望组件可以是:

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

    setOpaque(...)方法用于控制组件的不透明属性

    在任何一种情况下,这都可以确保移除任何绘画作品,并正确完成定制绘画

    如果你想使用tranparency,那么你需要自己进行自定义绘制,以确保背景被清除

    面板的定制喷漆为:

    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中查看自定义类,该类可用于任何将为您完成上述工作的组件