设置JTextPane的背景会导致视觉伪像(Java)

问题描述 投票:0回答:2

这是我关于stackoverflow的第一个问题,所以请不要对我(和我的英语)那么难,我会尽力问一个好问题。

问题是关于标题建议->设置JTextpane的背景(特别是将其设置为透明)。由于setBackground方法采用了一个颜色参数,所以我的处理方式是alpha值=0。这导致出现以下视觉瑕疵:

运行下面的代码时视觉工件的示例图片

enter image description here

我将详细描述它,说出我已经尝试过的内容,然后发布一个最小的示例,以使每个人都可以轻松地重新创建该错误。

我有一个JFrame(myFrame),其中保存了我要在其中绘制的JPanel(Test())。如代码中所见,此JPanel的背景设置为绿色。我这样做是为了使TextPane的背景与面板的实际背景有所不同。

我们还有一个JTextPane输入字段->接受用户输入(显示您编写的内容)。它由JScrollPane滚动窗格保存。

所以Target(意思是我要实现的目标::)是一个用户输入字段,它是透明的,但仍显示用户输入的文本。我试图通过设置输入字段的背景来实现这一点。和滚动窗格为透明颜色。

[如果您不只是输入类似内容(您需要为...设置setOpague(false)...),如果您不知道您在说什么,我会非常感激,因为我几乎尝试了所有操作我可以想到并阅读我在互联网上可以找到的有关该问题的每一篇帖子。我将在其中发布一些。所以...

我已经尝试过的内容:

我在搜索类似“如何使TextPane透明”之类的东西时发现的通常方法是,将setOpague(false)设置为自身以及滚动窗格和滚动窗格的视口。 1.了解该方法的实际作用,我认为这不是适当的解决方案。 2.在这三个值上设置Opague(false)会导致所有内容都不可见,所以这不好。设置背景后再次包装框架。要么什么都没有固定,要么组件变得完全不可见。

我也尝试过:setBackground(null),仅设置输入字段的背景(仅每个组件以及三个组件(滚动窗格,视口,输入字段)之间的每种可能组合),混合setOpague(true)/ setOpague(false)/ setBackground(...)我能想到的所有方式。覆盖textpane和scrollpane的paintComponent方法似乎是一个好方法,但是我对此并不满意。

所以这是code:

public class Test extends JPanel {

    JTextPane inputField = new JTextPane();
    JScrollPane scrollpane = new JScrollPane(inputField);

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        inputField.setBounds(10,10,100,100);
        scrollpane.setBounds(10,10,100,100);
    }

    public Test(){

        this.setOpaque(true);
        this.setBackground(Color.GREEN);

        inputField.setBounds(10,10,100,100);
        scrollpane.setBounds(10,10,100,100);

        inputField.setBackground(new Color(0,0,0,0));
        scrollpane.setBackground(new Color(0,0,0,0));
        scrollpane.getViewport().setBackground(new Color(0,0,0,0));
        this.add(scrollpane);

    }

    public static void main(String[] args) {
        JFrame myFrame = new JFrame();
        myFrame.add(new Test());
        myFrame.pack();
        myFrame.setSize(640,480);
        myFrame.setPreferredSize(new Dimension(640,480));
        myFrame.setVisible(true);
    }
}

这里还有一些链接到我读过的描述类似问题的帖子:

Java - Transparent JScrollPane

Transparent JEditorPane in a JScrollPane over a background JPanel

setOpaque(true/false); Java

如果有人可以帮助我解决这个问题,或者甚至只建议我提供替代解决方案,我将非常感激。我正在为我的大学的一个项目编写一个聊天程序自动取款机,我认为透明的消息字段是一个好主意。我会尽力在这里回答。提前谢谢。

java swing text background transparent
2个回答
0
投票

您的程序在启动时偶尔给我一些错误。确保从EDT(invokeLater())运行swing GUI。

导致您的问题的行是:

scrollpane.getViewport().setBackground(new Color(0,0,0,0));

还有-您是否有某些原因要手动设置边界而不是使用布局管理器?

也许我听不懂您的问题,或者您想在背景中显示图像-但您不能仅将文本区域的颜色设置为与JPanel相同的颜色吗?

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;

public class Test extends JPanel {

    JTextPane inputField = new JTextPane();
    JScrollPane scrollpane = new JScrollPane(inputField);

    public Test(){
        this.setBackground(Color.GREEN);

        scrollpane.setPreferredSize(new Dimension(300, 300));

        inputField.setBackground(Color.GREEN);

        this.add(scrollpane);

    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                   JFrame myFrame = new JFrame();
                    myFrame.add(new Test());
                    myFrame.setSize(640,480);
                    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    myFrame.setPreferredSize(new Dimension(640,480));
                    myFrame.setVisible(true);
                    myFrame.pack();
            }
        });
    }
}

0
投票

请勿将透明颜色用作背景-很难用它来删除(例如,在重涂组件时。)>

请勿使用setBounds(除非使用空LayoutManager)。在下面的示例中,我使用了setPreferredSize,但仍然更好地正确使用了LayoutManager(我有点懒,目前有很多工作要做)。

public class Test extends JPanel {

    JTextPane inputField = new JTextPane();
    JScrollPane scrollpane = new JScrollPane(inputField);

    public Test(){

        this.setOpaque(true);
        this.setBackground(Color.GREEN);

        inputField.setPreferredSize(new Dimension(300, 100));

        inputField.setOpaque(false);
        scrollpane.setOpaque(false);
        scrollpane.getViewport().setOpaque(false);

        this.add(scrollpane);

    }

    public static void main(String[] args) {
        JFrame myFrame = new JFrame();
        myFrame.add(new Test());
        myFrame.pack();
        myFrame.setSize(640,480);
        myFrame.setPreferredSize(new Dimension(640,480));
        myFrame.setVisible(true);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.