Как нарисовать невидимый JFrame в другом месте? - PullRequest
1 голос
/ 04 ноября 2011

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

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

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

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

Подсказка 2: может использоваться setGlassPane / setLayeredPane / setOpaque (false)для второго "слоя".

2 голосов
/ 04 ноября 2011

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

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

1 голос
/ 04 ноября 2011

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

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

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

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

...