2011-11-04 21 views
1

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

Дополнительная информация:
В моем проекте мне нужно повернуть и масштабировать окна. Я не хочу писать собственное окно-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); 
    } 
}
+0

Я не знаю, что вы подразумеваете под * «нарисовать невидимый JFrame в другом месте» * [sic] и я * действительно * не думаю, что это решение вашей проблемы. Теперь: вы * можете * отображать полностью прозрачные окна в Java **, но ** есть gotchas. В OS X Apple JVM, он всегда поддерживался (даже в старых версиях ОС X: работает на OS X 10.4). В Windows существуют неофициальные API (методы которых могут меняться/исчезать) с JVM 1.6.0_22, если я не ошибаюсь. В противном случае вы можете использовать JNA для получения любого уровня прозрачности в Windows/OS X/Linux/и т. Д. JNA поставляется с примером прозрачности. – TacticalCoder

+0

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

+0

@bit Похоже, вы хотите, чтобы какой-то буфер был нарисован перед копированием в рамку. В этом случае рассмотрите использование [BufferStrategy] (http://download.oracle.com/javase/7/docs/api/java/awt/image/BufferStrategy.html). Или создайте BufferedImage или [VolatileImage] (http://download.oracle.com/javase/7/docs/api/java/awt/image/VolatileImage.html) с помощью GraphicsConfiguration и нарисуйте его перед копированием. –

ответ

1

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

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

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

4) JComponents должен возвращения PrefferedSize для example

2

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

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

2

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

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

Смежные вопросы