Java - ol' 透明 JFrame,没有受限库

Posted

技术标签:

【中文标题】Java - ol\' 透明 JFrame,没有受限库【英文标题】:Java - the ol' transparent JFrame, without restricted libsJava - ol' 透明 JFrame,没有受限库 【发布时间】:2011-11-30 16:41:03 【问题描述】:

是的,这个问题无处不在。但是所有(工作的)解决方案都使用受限制的 AWTUtilities 工具包。

所以。我只想控制窗口的不透明度。无需塑造或取消装饰。只是一个透明的 contentPane(简单)和一个透明的 JFrame 背景(非常困难)。

我本可以发誓我昨天得到了正确的组合,但现在我似乎无法重现它。还有一些不使用 AWTUtilities 的解决方案,但它们不起作用……有人有好的解决方案吗?

我的失败代码示例:

public static void main(String[] args) 
    JFrame test = new JFrame();
    test.setSize(400, 400);
    test.setLocationRelativeTo(null);
    test.setUndecorated(true);
    test.setBackground(new Color(0, 0, 0, 0));
    test.getContentPane().setBackground(new Color(0,0,0,0));
    test.setVisible(true);

但这只会形成一个白色方块。关闭但没有雪茄。我也尝试过覆盖paint方法,有人说要丢弃alpha通道,但这使它变黑(当然)。所以......堆栈溢出它是。

如果有骗子能准确回答这个问题,请指点我,我会立即删除。

更新 根据 cmets 中的请求,这是我如何到达这里的历史记录:

每个人到达的第一个链接是how to create translucent and shaped windows.,其中有几行类似于“......具有 75% 不透明度的半透明框架”。所以...看起来它们的定义是一样的,至少在那篇文章中是这样。不幸的是,他们使用了这个库。

我可以追踪的几个链接:

http://www.java-gaming.org/index.php?topic=24635.0 报告了一个不工作的“工作”解决方案,这显示了一些希望,但我无法让它工作。

http://techgearup.wordpress.com/2008/09/19/transparent-jframe-background/ 是一种使用屏幕截图的骇人听闻的方式,并在其他几个地方被复制。

【问题讨论】:

你可以使用 Java 7 吗?您能否链接到一些可行的解决方案,以便我们了解您的尝试? 请不要confoundopacitytransparency 同意,这是 Java 7 的新特性之一:download.oracle.com/javase/tutorial/uiswing/misc/… @trashgod:他不是,你是,不透明和半透明指的是同一件事。来自 Java 文档:“boolean isWindowOpaque(Window window) 返回窗口是不透明的还是半透明的” 什么平台? this 有效吗?由于术语超载,另请参阅opacity。 【参考方案1】:

叹息 我遇到了同样的问题,经过大量时间的研究,我找到了一种在我的电脑上设置正确透明屏幕的方法。但是,一旦您将框架设置为透明,很多事情就会停止工作。如果您在任何地方使用 JTextArea 声明,它会立即停止工作。它甚至不会抛出错误!

所以这里是代码,希望这有一些用处。如果你用它制作了一个有效的 JScrollPane,请回复:)

public class gui 
    public frame f;
    public String name = "Transparent?"; //name your frame *
    public JButton exit = new JButton("Exit");
    public gui() //non-static context
        f = new  JFrame(name);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //*
        f.setLocationRelativeTo(null);
        f.setExtendedState(f.getExtendedState() | JFrame.MAXIMIZED_BOTH);
        //maximizes window. if you dont want it, f.setSize(int, int)
        f.setUndecorated(true); //necessary for setOpacity
        f.setOpacity(.7f); //achieve trasparancy
        f.setVisible(true); //show window
        exit.addActionListener(new ActionListener()
            public void actionPerformed(ActionEvent arg0)
                System.exit(0);
            
        );
        f.add(exit, BorderLayout.CENTER); 
        //since X is not available in the window, make a button to exit
    

    public static void main()
        new gui();
    

//* Note: since the default Window manager is set off with setUndecorated(true),
// the name and buttons won't really show. 

【讨论】:

哦,我忘了说,JTextField 仍然有效。到目前为止唯一不起作用的东西(我正在使用的东西)是 JTextArea 和 JScrollPane 我还没有测试过边框,但这不是主要问题【参考方案2】:

如果不使用 Java v.6u10+ 或调用本机代码的第三方库,您将无法做到这一点。在 Swing Frames 中,对话框和窗口被认为是“***组件”,并在底层窗口系统中呈现。在 Java v6u10 之前,所有***组件都有一个默认的、不透明的浅灰色背景,并且无法从 Java 代码中更改它。

【讨论】:

显然 Java 6u10 自 2008 年 10 月以来就已经发布,这对我的用户来说已经足够长了。如何在 Java 6u10 之后的版本中实现这一点? 在 6u10 - 你必须使用 AWTUtilities,在 7 之后他们向 Window 和其他一些类添加了方法。 download.oracle.com/javase/tutorial/uiswing/misc/…(我意识到您已将 AWTUtilities 设置为“受限”,但这基本上是 Java 为您提供的唯一方法。) 好的,感谢您的帮助。我正在开发一个开源项目,我不确定对无限制文件的态度。但这是一个不同的问题:)

以上是关于Java - ol' 透明 JFrame,没有受限库的主要内容,如果未能解决你的问题,请参考以下文章

Mac OSX上使用Java 7的透明JFrame / JWindow

为啥 JFrame 仍然不透明?

在 JFrame 中显示一个透明的 GIF 而没有在播放时保留每一帧? (初学者)

JPanel 使用透明 JFrame 不能很好地重新绘制

Java:带有非透明组件的透明 Windows?

如何忽略 JFrame 不透明度?