# JFrames verbinden



## Pommes9485 (5. Sep 2011)

Guten Tag,

ich habe 2 Frames, welche auch  in 2 Klassen sind. Ist es möglich diese zu verbinden ?
Also, das quasi das 1. Frame auf dem 2. Liegt ?


----------



## Volvagia (6. Sep 2011)

Entweder du schnappst dir das ContentPane und fügst es am anderen JFrame ein, oder du benutzt dazu JInternalFrame's.


----------



## njans (6. Sep 2011)

Das einfachste wäre wohl einfach an dem einen Frame .getContentPane() aufzurufen und dieses dann auf dem anderen hinzuzufügen. 
Danach kannst du den einen Frame halt schließen


----------



## Pommes9485 (6. Sep 2011)

Aber wenn ich mir das ContentPane schappe, kann ich denn dann noch alle Funktionen von Frame 1 nutzen, obwohl es auf Frame2 liegt ?


----------



## Volvagia (6. Sep 2011)

Ja. Die Komponenten liegen ja nicht direkt am JFrame, sie liegen am Contentp. Wenn du das entfernst bleiben die Komponenten darauf, und die Listener an den Komponenten usw.


----------



## Pommes9485 (6. Sep 2011)

Ich habe jetzt in das Frame, auf das das andere soll geschrieben :

```
setContentPane(f.getContentPane());
```
f ist halt das andere Frame.

Allerdings macht das keinen Unterschied.
Der Grund für mein Zaudern das beides einfach zu vereinen ist einfach :

Ich habe eine Array, wessen Index automatisch auch die Position der String bestimmt. Dadurch müsste ich sehr viel ändenr um es anders zu machen...

Ich benutzte jetzt das JInternalFrame, allerdings wird wenn ich nun das JDesktopPane erstelle nichts geöffnet...


----------



## Volvagia (6. Sep 2011)

Mit setContentPane ersetzt du das Alte. Du willst es aber doch hinzufügen, oder? Bei JInternalFrames musst du wie bei naiven Fenstern setSize/pack und setVisible aufrufen.


```
public class ContentPane
{
	private static final boolean CONNECT = true;
	
	public static void main(String[] args)
	{
		JFrame sourceFrame = new JFrame();
		sourceFrame.add(new JLabel("Ich liege auf dem ContentPane des Sources"));
		sourceFrame.pack();
		sourceFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		sourceFrame.setLocationRelativeTo(null);
		
		JFrame targetFrame = new JFrame();
		targetFrame.setLayout(new GridLayout(2, 1));
		targetFrame.add(new JLabel("Ich liege auf dem ContentPane des Targets"));
		targetFrame.pack();
		targetFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		targetFrame.setLocationRelativeTo(null);
		
		if(CONNECT)
		{
			Component sourceContent = sourceFrame.getContentPane();
			sourceFrame.removeAll();
			sourceFrame.dispose();
			targetFrame.add(sourceContent);
			targetFrame.pack();
		}
		else
			sourceFrame.setVisible(true);
		targetFrame.setVisible(true);
	}
}
```

Unter Umständen gibts ne Warnung im else-Statement. Die kommt von der Klassenkonstante, kannst du einfach ignorieren.


----------



## Pommes9485 (7. Sep 2011)

Ich habe deinen Code genutzt und halt anstatt new JFrame meine Klassen eingetragen. Es öffnet sich auch ein Fenster, auf dem entweder das eine oder das andere steht, aber nie beides. Die beiden Klassen habe ich auch schoin vertauscht und die Labels sehe ich auch beide. Aber der blaue Rahmen, welchen ich zeichne sieht man nicht.


----------



## Volvagia (7. Sep 2011)

Und wenn du danach valide und repaint am Frame mit dem neuen Content aufrufst?
Aber ich denke, du hast designmäßig JFrame und allg. Programm zu sehr in Abhängigkeit gebracht.


----------



## Pepe Rohny (7. Sep 2011)

Hi,

meinst du so was: 
	
	
	
	





```
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Point;

import javax.swing.JFrame;

final class FrameOnFrame 
extends JFrame 
implements Runnable {

    private final JFrame frame;

    private FrameOnFrame() {

        setTitle("Frame 1");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame = new JFrame("Frame 2");
        frame.setPreferredSize(new Dimension(160, 90));
        frame.pack();

        setPreferredSize(new Dimension(240, 135));
        pack();

        Point location = getLocation();
        location.x += 80;
        location.y += 45;
        frame.setLocation(location);

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new FrameOnFrame());
    }

    @Override
    public void run() {
        setVisible(true);
        frame.setVisible(true);
    }

}
```
 ?

was ist denn mit JInternalFrame?

Pepe


----------

