Как нарисовать невидимый JFrame в другом месте?

Я хочу нарисовать содержимое JFrame в другом кадре. В настоящее время он работает только в том случае, если JFrame виден.
Есть ли способ нарисовать скрытый JFrame?

Дополнительная информация:
В моем проекте мне нужно иметь возможность вращать и масштабировать окна. Я не хочу писать свой собственный оконный API, поэтому я подумал, что смогу просто рисовать JFrames или аналогичные классы контейнеров повернутым способом (что прекрасно поддерживает 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);
    }
}

person bit    schedule 04.11.2011    source источник
comment
Я не знаю, что вы подразумеваете под нарисовать невидимый JFrame в другом месте [так в оригинале], и я действительно не думаю, что это решение вашей проблемы. Теперь: вы можете отображать полностью полупрозрачные окна в Java, но есть подводные камни. В OS X Apple JVM он всегда поддерживался (даже в старых версиях OS X: точно работает в OS X 10.4). В Windows есть неофициальные API (методы которых могут измениться/исчезнуть) начиная с JVM 1.6.0_22, если не ошибаюсь. В противном случае вы можете использовать JNA для получения любого желаемого уровня прозрачности в Windows/OS X/Linux и т. д. JNA поставляется с примером прозрачности.   -  person TacticalCoder    schedule 04.11.2011
comment
Я хочу получить графическое содержимое фрейма, не делая его видимым для пользователя.   -  person bit    schedule 04.11.2011
comment
@bit Похоже, вы хотите, чтобы какой-то буфер рисовал перед копированием в кадр. В этом случае рассмотрите возможность использования Буферная стратегия. Или создайте BufferedImage или VolatileImage через GraphicsConfiguration и рисуйте на нем перед копированием.   -  person G_H    schedule 04.11.2011


Ответы (3)


Подсказка 1: JFrame setDefaultLookAndFeelDecorated(false)/setUndecorated(true) может быть полезен для окна без заголовка и границ;

Подсказка 2: поскольку setGlassPane/setLayeredPane/setOpaque(false) может быть полезен для второго «слоя».

person Joop Eggen    schedule 04.11.2011

Я хочу получить графическое содержимое фрейма, не делая его видимым для пользователя.

Класс Screen Image должен помочь. Хотя я думаю, что это будет работать только для «панели содержимого» фрейма, а не для всего фрейма (с заголовком и границами), если только вы не используете декорированный фрейм.

person camickr    schedule 04.11.2011

1) вы должны использовать правильный LayoutManager, а не setSize() или setBounds()

2) если используется null LayoutManager, то Container возвращает любой размер после setVisible(true);

3) если используется правильный LayoutManager, то Container возвращает свой Size после вызова pack();, в других руках этот контейнер не мог быть виден на экране (имеется в виду setVisible(true);)

4) JComponents должен возвращать PrefferedSize для примера

person mKorbel    schedule 04.11.2011