2009-07-29 52 views
3

使用this来自太阳的文章。我正在尝试创建一个透明窗口。AWTUtilities透明JFrame

我在框架上的标签内有一个图像。 我希望图像可见,但不可见的框架。

当我使用


try { 
    Class awtUtilitiesClass = Class.forName("com.sun.awt.AWTUtilities"); 
    Method mSetWindowOpacity = awtUtilitiesClass.getMethod("setWindowOpacity", Window.class, float.class); 
    mSetWindowOpacity.invoke(null, window, Float.valueOf(0.75f)); 
} catch (NoSuchMethodException ex) { 
    ex.printStackTrace(); 
} catch (SecurityException ex) { 
    ex.printStackTrace(); 
} catch (ClassNotFoundException ex) { 
    ex.printStackTrace(); 
} catch (IllegalAccessException ex) { 
    ex.printStackTrace(); 
} catch (IllegalArgumentException ex) { 
    ex.printStackTrace(); 
} catch (InvocationTargetException ex) { 
    ex.printStackTrace(); 
} 

这让寄托都透明是可以保持的组件并不透明。

回答

1

您可以尝试为帧的背景颜色设置Alpha通道,该通道不应降至组件。

window.setBackground(new Color(1.0, 1.0, 1.0, 0.25)); 

应该给你一个白色的透明窗口。

+1

谢谢!这对我来说非常适合...在Mac OS X上。它在其他平台上工作吗?在研究透明窗口的东西时,我发现了许多文章说在其他平台上需要其他技术。 http://explodingpixels.wordpress.com/2009/06/19/hud-on-windows-finally/ – slothbear 2009-11-09 02:50:10

0

您需要设置子组件的不透明度,像

childComponent.setOpaque(true); 

,这将使他们的不透明,不使框架不透明。

1

您仍然可以使用AWTUtilities类,而不是使用setWindowOpacity()setWindowOpaque()设置不透明度。这将关闭窗口的背景,但是您在窗口内绘制的任何东西仍然会像以前一样绘制。从最近的Java 6更新中,这是现在正确的做事方式。 AWTUtilities可以在两台Mac & MS Windows上使用。这些方法将在Java 7中移入java.awt.Window本身。

0

我想通过以下方式扩展上一个答案。这将创建一个具有0.05透明度或25.75中12.75的窗口。然后将组件设置为0.50f的透明度,这只会影响可点击的组件。非可点击的标签可以将其透明度设置为以往任何时候。然而,这补偿了它可改变颜色的可点击组件问题。

JWindow subFrame = new JWindow();   
subFrame.setBounds(0, 0, 500, 500); 
subFrame.setAlwaysOnTop(true); 
subFrame.setOpacity(0.50f); 
subFrame.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.05f)); 

JButton button = new JButton("Hello"); 
button.setBounds(20, 180, 100, 40); 

subFrame.getContentPane().setLayout(null); 
subFrame.getContentPane().add(button); 
subFrame.setVisible(true);