我在Java窗口上使用Windows Vista/7的DWM功能时遇到问题.我想让我的画面的背景使用Aero风格.Windows API来做到这一点是函数提供DwmExtendFrameIntoClientArea的dwmapi库.我已经设法通过JNA正确调用该程序,它完成了应该做的事情(你可以看到,例如在调整框架大小时,在下一次重绘之前,你会看到尚未绘制的区域中的正确的空气动力效果,见附图).
但某处(我无法弄清楚在哪里)背景画在Aero效果上并且效果丢失了.
我已经尝试过的:
ContentPane设置为不透明度的自定义falseLayeredPane和RootPane假Frame而不是aJFrameJFrame/ ContentPane黑色/全透明setLayersOpaque及其自定义变体,请参阅第一个答案以获取更多详细信息到目前为止,我无法成功删除该背景.这是AWT/Swing的限制吗?如何删除该背景或正确使用Aero效果?
非常感谢您的帮助.
这里是没有任何内容的框架的屏幕截图,将RootPane,LayeredPane和ContentPane的不透明度设置为false.我在调整大小时快速完成了.您会看到效果已正确应用于Java尚未绘制的区域.
http://i55.tinypic.com/v614qo.png(作为新用户,我无法直接发布图片...)
经过进一步调查,我发现了以下奇怪的行为.如果窗口大小为150x150或更低,则内容将以透明方式显示.这对于普通窗口组件来说非常小问题.如果通过覆盖paint()方法直接在框架上绘制,则所有内容都是半透明的.此外,坐标系似乎稍微偏离,它显示为JFrame设置为窗口的实际零点的零点.因此,Swing试图绘制到实际上窗口边界所在的区域,然后当然不可见.
请参阅此屏幕截图:http://d-gfx.kognetwork.ch/java_aero_bug.png
这是我使用的代码.
需要jna.jar和platform.jar.可从JNA主页获得.
import com.sun.jna.Function;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinNT.HRESULT;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
public class AeroFrame extends JFrame {
public AeroFrame() { …Run Code Online (Sandbox Code Playgroud)