【问题标题】:Artifacts on transparent Background透明背景上的伪影
【发布时间】:2011-12-03 23:45:18
【问题描述】:

我在 JFrame 中有一个半透明背景的 JLabel,但我在字母周围出现了一些伪影。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JLabel label = new JLabel("Hello World!");
        frame.setPreferredSize(new Dimension(200, 200));
        frame.setUndecorated(true);
        frame.setBackground(new Color(128, 128, 128, 128));
        //label.setOpaque(false);
        //label.setBackground(new Color(0, 0, 0, 0));
        //((JPanel) frame.getContentPane()).setOpaque(false);
        //((JPanel) frame.getContentPane()).setBackground(new Color(0, 0, 0, 0));
        frame.add(label);
        frame.pack();
        frame.setVisible(true);
    }
}

我已经尝试将不透明度应用于这些组件,但没有运气。我希望所有组件都完全不透明,因此 JFrame 的 java7 每像素透明度似乎是唯一的解决方案。

【问题讨论】:

    标签: java swing transparency jframe


    【解决方案1】:

    您不能只使用具有透明度的颜色作为背景。请参阅 Background With Transparency 了解解释和潜在解决方案。

    【讨论】:

    • 这篇文章指的是背景颜色被重新应用,因此变得越来越不透明,但没有处理字母周围的伪影。
    • @NCode 该帖子处理具有 opaque 属性的组件的责任,以保证组件的背景被完全绘制。当您在不透明组件上使用透明颜色时,您可能会遇到绘画问题。该帖子提供了example 可能发生的情况。它不限制可能出现的绘画问题。
    【解决方案2】:

    我无法重现您的问题,也许我的电池没电了,但您的 GPU 不是有问题吗???

    我尝试了@camickr 的建议,没有发生任何问题

    基于教程How to Create Translucent and Shaped Windows中的代码

    import java.awt.*;
    import javax.swing.*;
    
    public class TranslucentWindow extends JFrame {
    
        private static final long serialVersionUID = 1L;
    
        public TranslucentWindow() {
            super("Test translucent window");
            this.setLayout(new FlowLayout());
            this.add(new JButton("test"));
            this.add(new JCheckBox("test"));
            this.add(new JRadioButton("test"));
            this.add(new JProgressBar(0, 100));
            JPanel panel = new JPanel() {
    
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(400, 300);
                }
                private static final long serialVersionUID = 1L;
    
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    g.setColor(Color.red);
                    g.fillRect(0, 0, getWidth(), getHeight());
                }
            };
            panel.add(new JLabel("Very long textxxxxxxxxxxxxxxxxxxxxx "));
            this.add(panel);
            this.setSize(new Dimension(400, 300));
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
        public static void main(String[] args) {
            JFrame.setDefaultLookAndFeelDecorated(true);
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    Window w = new TranslucentWindow();
                    w.setVisible(true);
                    com.sun.awt.AWTUtilities.setWindowOpacity(w, 0.7f);
                }
            });
        }
    }
    

    【讨论】:

    • 有两个问题:1.您使用的是旧的 AWTUtilities,Java 7 无法使用,因此您应该使用 Window.setOpacity(...),但是 2.这两个函数都设置了一个全局透明度,我只希望背景变得透明,组件应该是完全不透明的。
    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2012-02-08
    相关资源
    最近更新 更多