【问题标题】:JFrame - Draw graphics over a transparent background?JFrame - 在透明背景上绘制图形?
【发布时间】:2012-09-11 21:33:35
【问题描述】:

我正在尝试制作一个未装饰的透明 JFrame,然后在其上绘制一些图形。如果我扩展 JFrame,将 undecorated 设置为 true,并使用覆盖绘制,我可以制作一个透明的 JFrame。像这样:

public class MainFrame extends JFrame {
public static void main(String[] args) throws Exception {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                MainFrame frame = new MainFrame();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


public MainFrame() {
    setTitle("ASDF");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setUndecorated(true);
    setBounds(0, 0, 200, 200);      
}

public void paint(Graphics g){
    g.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 20));
    g.drawString("ASDF", 100, 100);
}
}

问题是,当我尝试在其上绘制某些东西时,我无法清除为再次重绘绘制的内容。就像在这个例子中一样,文本保留了绘制时的背景。因此,如果我在框架后面移动一个窗口,它看起来很奇怪,因为框架本身具有旧背景。我尝试了 AlphaComposite.Clear,但这只会产生黑色背景。我能做什么?

【问题讨论】:

  • setBounds((d.width-640)/2, (d.height-480)/2, 640, 480); 你能让它在 200x100 分辨率下中断吗?去做。 setContentPane(contentPane); // actually not necessary since I am overriding paint 1) 没有任何东西被油漆。所以代码比覆盖它更“消除油漆” 2)“没有必要”在这里变得“适得其反”。不透明的面板几乎会完全覆盖自定义渲染。
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 我稍微编辑了我的Q,你可以编译并运行这个例子。除非您实际运行它,否则您可能无法了解正在发生的事情。 (并在它创建的框架后面移动窗口等)

标签: java swing jframe transparency


【解决方案1】:

如果我扩展 JFrame,将 undecorated 设置为 true,并用它覆盖绘制,我可以制作一个透明的 JFrame。

我不这么认为。你只是在不关心背景的情况下绘画,这很快就会消失。如果你想知道如何在 java 中使用 Stackoverflow 制作透明窗口:搜索 [java] transparent window。这应该可以帮助您创建这样一个窗口,但这是一项相当复杂的任务:Transparent Window

【讨论】:

  • 我最终通过“作弊”完成了一个透明窗口——我使用 java.awt.Robot 创建了一个屏幕截图,然后将其绘制在框架上。
猜你喜欢
  • 1970-01-01
  • 2011-02-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多