Java - 透明的JFrame,没有受限制的库

时间:2011-10-04 13:08:33

标签: java swing jframe opacity

是的,这个问题无处不在。但是所有(工作)解决方案都使用受限制的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);
}

但这只是一个白色方块。关闭但没有雪茄。我也尝试重写绘制方法,有人在说丢弃alpha通道的东西,但这使它变黑(当然)。所以... Stack Overflow就是。

如果有一个傻瓜完全回答这个问题,请指出我并立即删除。

更新 根据评论中的要求,这里是我如何到达这里的历史:

每个人到达的第一个链接是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/是一种使用屏幕截图的hackish方式,并且在其他一些地方也是重复的。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

叹息我遇到了同样的问题,经过大量的工作,我找到了一种在我的计算机上获得正确设置透明屏幕的方法。但是,一旦设置框架透明,很多东西就会停止工作。如果您在任何地方使用JTextArea声明,它会立即停止工作。它甚至不会抛出错误!

所以这是代码,希望这有一些用处。 Plz回复你是否用它来制作一个有效的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.