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 吗?您能否链接到一些可行的解决方案,以便我们了解您的尝试? 请不要confoundopacity 和transparency。 同意,这是 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