java - 设置 JTextPane 的背景会导致视觉效果 (Java)

标签 java swing text background transparent

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

问题在于标题所暗示的内容 -> 设置 JTextpane 的背景(特别是将其设置为透明)。由于 setBackground 方法采用颜色参数,因此我采用的方法是使用 alpha 值 = 0。这会导致以下视觉伪像:

运行下面的代码时的视觉效果示例图片

enter image description here

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

我有一个 JFrame (myFrame),其中包含一个 JPanel (Test()),我在其中进行绘画。正如您在代码中看到的,该 JPanel 的背景设置为绿色。我这样做是为了区分 TextPane 的背景和面板的实际背景。

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

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

如果你不只是输入类似的内容(你需要 setOpague(false) for ....) 如果你不确切知道你在说什么,我会非常感激,因为我几乎尝试过我能想到的一切和阅读我在互联网上找到的关于这个问题的每一篇文章。我将在最后发布其中一些。所以...

我已经尝试过的:

我在搜索“如何使 TextPane 透明”之类的内容时发现的通常方法是对其本身以及滚动 Pane 和滚动 Pane 的视口(viewport)进行 setOpague(false) 。 1. 阅读该方法的实际用途后,我认为这不是一个正确的解决方案。 2. 在这三个上设置 Opague(false) 会导致所有内容都不可见,所以这不好。设置背景后再次打包框架。要么什么都没有修复,要么组件变得完全不可见。

我还尝试过:setBackground(null)、仅设置输入字段的背景(仅设置每个组件以及三者之间的每个可能的组合(滚动 Pane 、视口(viewport)、输入字段))、混合 setOpague(true)/setOpague(false)/setBackground(...) 以我能想到的各种方式。重写textpane和scrollpane的paintComponent方法似乎是一个很好的方法,但我并没有走得太远。

所以这是代码:

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

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

最佳答案

不要使用透明颜色作为背景 - 很难用它删除(例如,当组件被重新绘制(并且不透明)时)。

不要使用setBounds(除非使用null 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.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        myFrame.setPreferredSize(new Dimension(640,480));
        myFrame.pack();
        myFrame.setVisible(true);
    }
}

应该在 EDT 上调用 main 的整个代码(例如 SwingUtilities.invokeLater),因为它正在操作 swing 组件,但这不是问题的一部分(并且此处不相关,因为 setVisible 是最后一个命令 - 组件在更改时不会显示)。

关于java - 设置 JTextPane 的背景会导致视觉效果 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59787156/

相关文章:

java - 更改 JSlider 的外观

python - 如何查找和计算列表和文本之间的多个交集?

java - 如何限制 Eclipse 中的搜索匹配以过滤掉评论中的结果?

java - Files.walk 跳过目录

java - 从多个请求中获取带有 id 和响应正文的 map

java - 对象 ArrayList 中 contains(Object o) 的时间复杂度

java - 在 Java 中,使用 GUI 构建器或手动编码制作 GUI(Swings) 是一种好习惯吗?

java - 在程序启动时在后台执行操作

html - Tahoma 文字看起来不流畅

d3.js - 鼠标悬停时的 D3 文本