2012-05-14 43 views
0

我有一个JFrame的子类(它包含JButton,Title和Jpanel),我添加了一个JPanel。 Jpanel占据了borderlayout的中心部分。我想让JPanel变得透明(它应该可以看到Frame窗口)。如何将非透明组件添加到java 1.5中的透明JFrame?

正如我为Java 1.5所做的那样,我使用了JFrame.setOpacity(0.0f)来设置Jframe的透明度。通过这样做,JFrame的所有组件(即按钮,标题和jPanel)都使用相同的Alpha级别。但我只想让JPanel变得透明。

我用JLayeredPane通过改变Z顺序来尝试使用相同的结果。

我打开使用外部库如JNA(JNA windowsUtil也做同样的setOpacity()方法)和使用java7或java6类作为外部库到我的应用程序。

我甚至经历了一些以前问有没有帮助的问题:

Opaque components on transparent Java windows

Java: Transparent Windows with non-transparent components?

Re-paint on translucent frame/panel/component.

+0

如果您使用JNA实用程序,您可以*通过在窗口上设置一个alpha遮罩来指示所需的不透明度,从而获得所需的效果,然后将非透明位置于原始的重量级组件中窗口。这项工作是否在很大程度上取决于透明度如何在给定平台上逐级缩小窗口层次结构。 – technomage

+0

顺便说一句,JNA实用程序提供了设置全局窗口alpha,窗口位掩码和alpha掩码。最后一个最有可能为你正在尝试做的事情工作。你不可能得到java [67]代码来使用早期的JVM。 – technomage

回答

1

使用JNA的WindowUtils.setWindowTransparent()方法来启动一个完全透明的窗口。绘制到该窗口中的任何像素都将保留其alpha组件。

JFrame f = ... 
WindowUtils.setWindowTransparent(f, true); 
// ensure JPanel content pane doesn't paint its (solid) background 
f.getContentPane().setOpaque(false); 
// Any other added components will be painted normally 
f.getContentPane().add(new JButton("I'm opaque")); 

这应该能够达到预期的效果。

如果您希望您的容器为半透明或其他不透明组合,则需要澄清所需的结果。

+1

谢谢你的时间帮助我...但是我担心上面那个不起作用。如你所知,JButton是一个轻量级对象,它从它的祖先窗口中获取它的alpha值。 –

+0

我看到了你的帖子:http://rabbit-hole.blogspot.in/2007/04/alpha-mask-transparency.html。你可以给我这篇文章的源代码的链接。您能否提供有关在JNA中实际进行掩蔽的信息 –

+1

该代码包含在JNA项目中。通常,按钮的LAF将绘制按钮的内容区域,并将其背景绘画留给其父项。如果你的按钮没有完全绘制它的内容区域,你需要修改它,或者使用setOpaque(true)(获得默认的bg),或者给它一个绘制其背景的父项。 – technomage

0

这里是一个小例子,有两个标签。一个是完全不透明的,另一个是半透明的。这可以通过JPanel的工作为好,但出于演示的宗旨,更examplative用的JLabel:

import java.awt.BorderLayout; 
import java.awt.Color; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

import com.sun.awt.AWTUtilities; 

public class Test3 { 

    protected static void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.setUndecorated(true); 
     AWTUtilities.setWindowOpaque(frame, false); 
     JLabel label = new JLabel("Hello NOT transparent label"); 
     label.setOpaque(true); 
     label.setBackground(new Color(255, 0, 0)); 
     JLabel transLabel = new JLabel("Hello transparent label"); 
     transLabel.setOpaque(true); 
     transLabel.setBackground(new Color(255, 0, 0, 50)); 
     frame.setLocationByPlatform(true); 
     frame.getContentPane().add(label); 
     frame.getContentPane().add(transLabel, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 
+0

谢谢你的回复。正如我所说我想要为java1.5(它没有AWTUtilities.setWindowOpaque方法)的应用程序,所以试图使用jre1.6u10类作为我的依赖库,但它有类的重复的问题JRE1.5。所以,如果有其他选择,你能帮我吗? –

+0

@ user1371881我认为你运气不好。另见这篇文章:http://stackoverflow.com/questions/1416869/how-to-distribute-awtutilities –

+0

我已经看到了这篇文章......并试图通过改变类名来摆脱依赖关系,但是jre1.6u10和jre1.5有很多变化。所以,我放弃了这个过程,并寻找像JNA这样的本地库替代品(事实上它并没有帮助)。有一些屏幕截图捕捉WEbsites像www.screencast-o-matic.com,即使jre1.5也在做同样的事情。所以有一定的办法 –