3

所以这是交易:

我在那个里面有一个 JPanel 和一个 JTextArea。JPanel 的背景颜色具有 200 的 alpha 值,即。您可以通过 JPanel 部分看到背景图像。那不是叫部分透明吗?无论如何,然后我将 JTextArea 设置为不透明的,这样我就可以完全看透那个:

JPanel p = new JPanel();
p.setBackground(new Color(237, 234, 215, 200);
JTextArea jta = new JTextArea("Blahblahblahblah");
jta.setOpaque(false);
p.add(jta);

好的,所以当我点击一个按钮时,文本将像这样更改:

jta.setText("new BlahBlah...");

然后它发生了:第一个文本保留在那里,上面有一层新的部分透明薄膜。我添加的文本当然是最重要的,但在后面你可以看到前一个。当我再更改几次文本时,鬼影消失了。

屏幕截图作为链接。

翻译(截图一排有3个截图):
左一个: “问题#1 out of 8:(政治问题)?(我的评论:OK)”
中间: “问题#2 out of 8:(另一个问题,没关系)?(我的评论:鬼就在那里![和指向它的箭头])”
右侧: “问题#8 / 8:(另一个问题)?(我的评论:好的)”

如果我将此程序交换的问题数量减少,例如从 8 个减少到 3 个,例如,最后一个看起来通常很好,鬼就消失了。但有时无论我做什么,它都会坚持下去。这可能与内存不足有关(不过,我几乎无法接受)?

所以,请帮帮我,伙计们!我的最后期限是 48 小时。

PS。如果您想知道,该语言是芬兰语。我正在做一个学校项目:这将是一个可以有多种应用的比较机器:例如,如果你即将举行公开选举,新闻/媒体可能会在网络上使用这种机器来获取候选人对任何问题的意见,然后选民也可以输入他们的意见,机器计算出哪些候选人最符合选民的想法。见我的主页,即。如果您有兴趣,请访问项目博客(芬兰语)以获取更多屏幕截图。

安55i

4

2 回答 2

2
p.setBackground(new Color(237, 234, 215, 200);

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

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

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

于 2011-01-14T17:37:20.443 回答
0

终于我把它显示出来了!就是这样:

  1. 容器(本例中为p)和里面的组件(jta)都必须是setOpaque(false);
  2. 容器必须始终通过抓取内部组件的背景颜色来清除自身,这实际上是内部组件从它的祖先那里获得的颜色,即。容器本身。

我不是在某种程度上是正确的吗?好吧,至少代码可以解决问题。

类字段:

private JTextArea jta;
private JPanel p;

稍后的:

jta = new JTextArea("BlahBlahBLAH");
jta.setBackground(new Color(237, 234, 215, 200));
p = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        if(getContentPane().isAncestorOf(jta)) {
            g.setColor(jta.getBackground());
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    }
};

p.setOpaque(false);
jta.setOpaque(false);
p.add(ta);

就是这样。我什至在将“jta”添加到“p”之前添加了一些边框和东西。最酷的是,我实际上学到了一些东西。感谢您的支持!

于 2011-01-14T22:27:17.243 回答