user-interface - Java Swing - 半透明组件

标签 user-interface swing components transparency translucency

我最近问了一个关于半透明组件因看似未正确更新而导致奇怪工件的问题。我收到的答案导致伪像消失,但代价是半透明。

解决方案是 - 对于每个半透明组件 - 也调用 setOpaque(false) 函数。这样,Swing 知道它需要重绘这些组件后面的背景。

但是,这是以我试图实现的半透明为代价的。它导致组件变得透明。

前提是这样的:我正在为一个聊天客户端设计GUI,一个功能要求是要有一个背景。我通过遵循扩展 JPanel 类的代码片段成功地使背景正常工作,但随后我希望组件允许显示背景。设置半透明度后,更新组件的剩余部分会显示在不应该显示的位置。我来到这里解决了我的问题,但现在我遇到了一个新问题。所以我们到了。

所以,这是我的猜测:

-为每个所需的组件调用 setOpaque(false) 函数并且不设置半透明颜色无法达到我想要的效果。

-设置半透明颜色而不调用 setOpaque(false) 允许显示半透明背景,但会导致伪影,让我回到原点。

所以我需要在没有伪影的透明和有伪影的半透明之间找到一些中间立场。也就是说,我想要一个没有伪影的半透明背景(不是完全透明)。

看来我需要重写 JFrame 以使其重新绘制所有组件,无论不透明度如何。除非我错过了什么……这就是我来这里的原因!

谢谢!

(这是原始问题的链接,并附有图片供引用:Java Swing - Translucent Components causing Artifacts)

最佳答案

一种选择是覆盖组件并自己绘制背景:

class TranslucentLabel extends JLabel {
    public TranslucentLabel(String text) {
        super(text);
        setOpaque(false);
    }

    @Override
    public void paintComponent(Graphics g) {
        g.setColor(new Color(255, 0, 0, 64));
        Insets insets = getInsets();
        g.fillRect(insets.left, insets.top, 
                getWidth() - insets.left - insets.right, 
                getHeight() - insets.top - insets.bottom);
        super.paintComponent(g);
    }
}

编辑:或者,您可以将子组件的半透明背景色直接绘制到面板上,这样您就不必覆盖组件:

class YourPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D)g.create();

        // Draw your background image here to g2d.

        g2d.setColor(new Color(255, 0, 0, 64));
        Area area = new Area();
        for (Component component : getComponents()) {
            area.add(new Area(component.getBounds()));
        }
        g2d.fill(area);
        g2d.dispose();
    }
}

这种方法有一个缺点。如果组件有真正透明的部分(例如圆形边框),则其整个背景将被着色。

关于user-interface - Java Swing - 半透明组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4982960/

相关文章:

windows - 在哪里可以找到 Windows 应用程序的用户界面 (UI) 设计模式?

python 非 web 应用程序模式

java - Java GUI 中什么也没有出现

java - JPanel 上的 Graphics2D 并将 JPanel 添加到 JFrame

java - 使用 setRowSelectionInterval(int, int) 后无法通过箭头键导航 JTable

java - 异步任务流程

java - 如何给JButton设置 "very dark blue "背景色?

javascript - React setstate 只能更新已安装或正在安装的组件——在重新渲染时

javascript - 我如何重用不同颜色的 react 组件?

angular - 如何在Angular2中的多个组件之间共享服务