使用 frame.setBackground(0, 255, 0, 0) 不适用于 linux [英] using frame.setBackground(0, 255, 0, 0) doesn't work with linux

查看:38
本文介绍了使用 frame.setBackground(0, 255, 0, 0) 不适用于 linux的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我通过将背景 alpha 设置为 0 使 JFrame 背景透明,但是如果我在 linux 中运行程序,JFrame 背景是白色的,这是为什么?

so I have been make a JFrame background transparent by setting the background alpha to 0, however if I run the program in linux the JFrame background is white why is this?

好的,我发现它与将图形渲染到框架有关,这种方法很旧,我不再需要在程序中使用它,但我仍然想知道为什么会发生这种情况(它只是在 Linux 中可以找到)窗户)

ok I found its got something to do with rendering graphics to the frame, this method is old I don't need it in the program anymore but i would still like to know why this happens (its just in Linux works find in windows)

这是一个可运行的例子

import java.awt.*;
import java.awt.Color;
import javax.swing.*;

class Main extends JFrame{
private void init() {

    this.setPreferredSize(new Dimension(1420, 820));
    this.setUndecorated(true);
    this.setResizable(false);
    this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
    this.setBackground(new Color(0, 255, 0, 0));
    this.requestFocus();
    this.setVisible(true);
    this.validate();
    this.pack();
    Color color = UIManager.getColor("activeCaptionBorder");
    this.getRootPane().setBorder(BorderFactory.createLineBorder(color, 1));
    paintInfo();
}

private void paintInfo() {
    Graphics g = this.getGraphics();
    g.setColor(new Color(222, 222, 222, 4));
    g.setFont(new Font("Arial Black", Font.BOLD, 15));
    g.setColor(Color.BLACK);
    g.drawString("test String ",this.getWidth()/2, this.getHeight()/2);
    g.dispose();
}

public static void main(String[] args) {
    JFrame.setDefaultLookAndFeelDecorated(true);
    new Main().init();
}
}

推荐答案

让我们从...开始

private void paintInfo() {
    Graphics g = this.getGraphics();
    g.setColor(new Color(222, 222, 222, 4));
    g.setFont(new Font("Arial Black", Font.BOLD, 15));
    g.setColor(Color.BLACK);
    g.drawString("test String ",this.getWidth()/2, this.getHeight()/2);
    g.dispose();
}

Swing 中绘制是如何完成的,并且处理不是您创建的 Graphics 上下文会导致一些奇怪的事情......

Isn't how painting is done in Swing and disposing of a Graphics context you didn't create will lead to manner of strange things...

相反,创建您的框架,设置它的透明度,然后向其中添加另一个组件,例如您想要的实际绘画...

Instead, create your frame, set up it's transparency and then add another component to it, which does the actual painting that you want, for example...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagLayout;
import java.awt.LinearGradientPaint;
import java.awt.Point;
import java.awt.Rectangle;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

/**
 *
 * @author swhitehead
 */
public class JavaApplication233 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        GraphicsEnvironment ge
                        = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();

        //If translucent windows aren't supported, exit.
        if (!gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT)) {
            System.err.println("Per-pixel translucency is not supported");
            System.exit(0);
        } else {
            new JavaApplication233();
        }
    }

    public JavaApplication233() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setUndecorated(true);
                frame.setBackground(new Color(0, 0, 0, 0));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setOpaque(false);
            setLayout(new GridBagLayout());
            add(new JLabel("I'm not wearing anything"));
//          Color color = UIManager.getColor("activeCaptionBorder");
            setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            LinearGradientPaint lgp = new LinearGradientPaint(
                            new Point(0, 0),
                            new Point(0, getHeight()),
                            new float[]{0f, 1f},
                            new Color[]{applyAlpha(Color.RED), applyAlpha(Color.YELLOW)}
            );
            g2d.setPaint(lgp);
            g2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
            g2d.dispose();
        }

        protected Color applyAlpha(Color color) {
            return new Color(color.getRed(), color.getGreen(), color.getBlue(), 64);
        }

    }

}

这篇关于使用 frame.setBackground(0, 255, 0, 0) 不适用于 linux的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆