JScrollPane 透明背景和内容

5
在我的应用程序中,我展示了一个弹出式对话框来显示一个大的卡片列表。我在一个JPanel子类中将它们显示为多个JLabel组件中的图像。然后,我将该对象放入一个JScrollPane中,以便通过卡片进行水平滚动。
我希望未使用的空间是透明的,并且有一个深色背景,以显示其后面的内容被禁用了。我使用setBackground(new Color(50, 50, 50, 200))来实现我想要的外观,但是它后面的内容不会重新绘制,因此我得到了伪影。
如下图所示:
https://istack.dev59.com/ohSIj.webp 我该如何解决这个问题?当我滚动时,如何使背后的内容重新绘制?
提前感谢您。
2个回答

6
取暂时去掉窗口。
JScrollPane 包含一个 JViewport,然后包含你的内容。所以你需要将你的内容面板设置为透明,将视口设置为透明,然后将滚动面板设置为透明。
你可以通过在这些容器上使用 setOpaque(false) 来实现这一点。
这将确保重绘管理器现在会通过背景进行绘制。
下一个问题是,Swing 实际上不支持“半透明”组件(即,它要么是不透明的,要么是透明的)。
你可以通过覆盖主组件(视口上的组件可能足以)的 paintComponent 方法来实现这个功能。

“JViewport” 的使用很好。我之前不知道它的存在。我结合两个答案一起解决了问题。 - MaxGhost

1

尝试以下操作...可能会在滚动过程中带来一些缓解。当主框架最大化或还原时,您很可能也会遇到问题。您需要监听这些事件并进行类似的修复。

    jScrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
        @Override
        public void adjustmentValueChanged(final AdjustmentEvent e) {
            sevenWondersframe.repaint();
        }
    });
    jScrollPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() {
        @Override
        public void adjustmentValueChanged(final AdjustmentEvent e) {
            sevenWondersframe.repaint();
        }
    });

谢谢。我结合了两个答案来修复它。 - MaxGhost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接