2011-10-04 30 views
5

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

所以。我只想控制窗户的不透明度。没有必要塑造或不需要涂抹。只是一个透明的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); 
} 

但这只是让一个白色正方形。关闭,但没有雪茄。我也尝试覆盖绘画方法,并且有人在谈论关于抛出Alpha通道的问题,但是这使它变成了黑色(当然)。所以...堆栈溢出它。

如果有确切的答案,请点我,然后马上删除。

更新 每在评论的请求,这里是我是如何来到这里的历史记录:

第一个环节大家到达是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/是一种使用屏幕截图的黑客方式,并在其他几个地方复制。

+3

你可以使用Java 7 PLZ回复?你能链接到一些工作解决方案,以便我们看到你所尝试过的吗? –

+1

请不要[confound](http://stackoverflow.com/questions/3517722/java-transparent-jscrollpane/3518047#3518047)_opacity_和_transparency_。 – trashgod

+0

同意,这是Java 7的新功能之一:http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html –

回答

1

如果不使用Java v.6u10 +或调用本机代码的第三方库,则无法执行此操作。在Swing框架中,对话框和Windows被认为是“顶级组件”,并在底层窗口系统中呈现。在Java v6u10之前,所有的顶级组件都有一个默认的,不透明的浅灰色背景,并且没有办法从Java代码中改变它。

+0

显然,自从2008年10月以来,Java 6u10就已经出现,这足以让我的用户拥有它。 Java 6u10之后的版本如何实现? – Ben

+0

在6u10中 - 您必须使用AWTUtilities,7之后他们将方法添加到Window和其他类。 http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html#6u10(我知道你已经设置了AWTUtilities是“受限”的,但这基本上是Java为你提供的唯一方法。 ) – Nate

+0

好的谢谢你的帮助。我正在开发一个开源项目,我不确定对不受限制文件的态度。但是,这是一个不同的问题:) – Ben

0

叹息我遇到了同样的问题,经过大量的时间处理后,我找到了一种方法在计算机上正确设置透明屏幕。但是,只要将框架设置为透明,许多事情就会停止。如果你在任何地方使用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. 
+0

哦,我忘了提及,JTextField仍然有效。目前为止唯一不能使用的东西(我使用的东西)是JTextArea和JScrollPane 我还没有测试边界,但它不是主要问题 – nkazuko

+1

请学习java命名约定并坚持使用它们 – kleopatra