【问题标题】:How to paint an invisible JFrame elsewhere?如何在其他地方绘制不可见的 JFrame?
【发布时间】:2011-11-04 10:46:28
【问题描述】:

我想将 JFrame 的内容绘制到另一个框架上。目前,我只有在 JFrame 可见时才能使用它。
有没有办法绘制隐藏的 JFrame?

附加信息:
在我的项目中,我需要能够旋转和缩放窗口。我不想编写自己的 window-api,所以我想我可能能够以旋转的方式绘制 JFrame 或类似的容器类(Graphics2D-API 很好地支持)。能够为此使用标准 JFrame 真是太棒了,但是扩展 JFrame 的自定义框架也可以..

public class JFTest extends JFrame {
    private JFrame frameToPaint = null;

    public static void main (String[] args) {
        new JFTest ();
    }

    public JFTest () {
        // some basic initialization
        super ("Container");
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        setExtendedState (JFrame.MAXIMIZED_BOTH);
        add (new JPanel () {
            @Override public void paintComponent (Graphics g) {
                super.paintComponent (g);
                // painting the child frame's contents onto this frame
                if (frameToPaint != null) frameToPaint.getRootPane().paintAll (g);
            }
        });
        setVisible (true);

        // initializing some test-frame that will get painted onto the container
        frameToPaint = new JFrame ("child");
        frameToPaint.setSize (200, 100);
        frameToPaint.add (new JLabel ("test"));
        frameToPaint.addComponentListener (new ComponentAdapter() {
            @Override public void componentResized (ComponentEvent e) { repaint (); }
            @Override public void componentHidden  (ComponentEvent e) { repaint (); }
        });

        // magic line. an invisible frame will not get painted! why??
        frameToPaint.setVisible (true);
    }
}

【问题讨论】:

  • 我不知道您所说的 “在其他地方绘制一个不可见的 JFrame”是什么意思 [原文如此] 我真的不认为这是解决您的问题。现在:您可以在 Java 中显示完全半透明的窗口但是有一些问题。在 OS X Apple JVM 上,它一直受到支持(即使在旧的 OS X 版本上:肯定可以在 OS X 10.4 上运行)。在 Windows 上,如果我没记错的话,自 JVM 1.6.0_22 以来就有非官方 API(其方法可能会更改/消失)。否则,您可以使用 JNA 在 Windows / OS X / Linux / 等上获得所需的任何透明度。JNA 附带了一个透明度示例。
  • 我想获取框架的图形内容,而不必使框架对用户可见。
  • @bit 听起来您希望在复制到帧之前先绘制某种缓冲区。在这种情况下,请查看BufferStrategy 的使用情况。或者通过 GraphicsConfiguration 创建一些 BufferedImage 或 VolatileImage 并在复制之前对其进行绘制。

标签: java swing jframe hidden paint


【解决方案1】:

提示 1:JFrame 的 setDefaultLookAndFeelDecorated(false)/setUndecorated(true) 可能用于没有标题和边框的窗口;

提示 2:因为 setGlassPane/setLayeredPane/setOpaque(false) 可能用于第二个“层”。

【讨论】:

    【解决方案2】:

    我想获取框架的图形内容,而不必使框架对用户可见

    Screen Image 类应该会有所帮助。虽然我认为它只适用于框架的“内容窗格”而不是整个框架(带有标题栏和边框),除非您使用装饰框架。

    【讨论】:

      【解决方案3】:

      1) 你必须使用正确的LayoutManager,而不是setSize()setBounds()

      2) 如果使用了null LayoutManager,则ContainersetVisible(true); 之后返回任意大小

      3) 如果使用了正确的LayoutManager,则Container 在调用pack(); 后返回它的Size,换句话说,这个容器在屏幕上是不可见的(意思是setVisible(true);

      4) JComponents 必须为example 返回 PrefferedSize

      【讨论】:

        猜你喜欢
        • 2011-08-17
        • 2016-08-19
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 2012-06-19
        • 1970-01-01
        • 2015-04-15
        • 1970-01-01
        相关资源
        最近更新 更多