Артефакты на прозрачном фоне - PullRequest
3 голосов
/ 04 декабря 2011

У меня есть JLabel в JFrame с полупрозрачным фоном, но я получаю некоторые артефакты вокруг букв.

Screenshot of the Artifacts

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);
    }
}

Я ужепопытался применить непрозрачность к этим компонентам без удачи.Мне бы хотелось, чтобы все Компоненты были полностью непрозрачными, поэтому прозрачность java7 на пиксель для JFrame представляется единственным решением.

Ответы [ 2 ]

6 голосов
/ 04 декабря 2011

Вы не можете просто использовать Цвета с прозрачностью в качестве фона.См. Фон с прозрачностью для объяснения и возможного решения.

2 голосов
/ 04 декабря 2011

Я не могу воспроизвести вашу проблему, возможно, у меня разряжена батарея, но нет ли проблемы с вашим графическим процессором ???

enter image description here enter image description here

Я попробовал предложение @camickr, ничего плохого не случилось

enter image description here

и

enter image description here

на основе кода из урока Как создать прозрачные и фасонные окна

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);
            }
        });
    }
}
...