# JLayeredPane - Wie funktioniert das mit den Layern?



## shiny_hair (6. Apr 2006)

Hallo,

ich habe einige Fragen zum Umgang mit JLayeredPane, da ich absolut nicht klar komm damit.
Ich erkläre einfach mal grob meine Vorgehensweise, da es mir am Grundverständnis mangelt:
Vom aktuellen JApplet übergebe ich per getRootPane() das RootPane an meine Grafikklasse (myGrafik extends JFrame). Dort füge ich einen Container hinzu:

```
this.setRootPane(uebergebenesRootPaneVonJApplet);
this.getLayeredPane().setBounds(0, 0, 890, 490);
this.getLayeredPane().setLayer(mycontainer, 30000);
this.getLayeredPane().add(mycontainer, 30000);
```
(_Kurios: Wenn this.getLayeredPane().setLayer(mycontainer, JLayeredPane.DEFAULT_LAYER) angebe, dann spuckt mir eclipse eine Fehlermeldung aus:  the method setLayer(Component, int) in the type JLayeredPane is not applicable for the arguments (Container, int). Diese Fehlermeldung kommt aber nur bei Windows, nicht bei Linux._)

Dieser Container (mit GridBagLayout) ist meine Grundfläche, wo ich JPanel, JComboBox, JMenuBar und andere JKonsorten platziere. Später möchte ich darüber ein JPanel platzieren.

Um's nochmal in kurzen Worten zusammenzufassen: ich füge dem LayeredPane vom aktuellen RootPane einen Container mit den Komponenten hinzu.

Wenn ich nun starte, dann passiert nichts. Nur ein leeres, weißes Fenster, keine Fehlermeldung.

Müssen die einzelnen Komponenten (JPanel, JComboBox, JMenuBar, usw.) bei JLayeredPane extra berücksichtigt werden? Reicht es nicht, wenn das Grundobjekt (der Container) berücksichtigt wird?

Gruß
Michael


----------



## shiny_hair (7. Apr 2006)

Hier nun etwas Code:
	
	
	
	





```
public class Schaender extends JApplet {

	private static final long serialVersionUID = 1364602078344152051L;
	Grafik myGrafik;
	
	public void init () {

		setSize(890, 490); 

		try {
			myGrafik = new Grafik(this.getRootPane(), this.getCodeBase().toURI());
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
		myGrafik.startGrafik();
	}
}


class Grafik extends JFrame {
	
	private static final long serialVersionUID = 4435345634634276L;
	
	Ordner myOrdner;
	
	JLayeredPane mylayer = new JLayeredPane();
	Container mycontainer = new Container();
	Container mypop = new Container();
	
	GridBagLayout mylayout = new GridBagLayout();
	GridBagConstraints mycons = new GridBagConstraints();
	JMenuBar mybar = new JMenuBar();
	JMenu mymenu = new JMenu("Menue");
	JMenuItem mymenuitem = new JMenuItem("Ueber...");
	JPanel oben = new JPanel(); //fuer Bildvorschau
	JPanel wahl = new JPanel(); //ComboBox fuer Ordnerwahl
	JComboBox wahlbox = new JComboBox();
	JList mitte = new JList(); //fuer Bildliste
	JScrollPane mittescroll = new JScrollPane(mitte); //zum Scrollen der JList
	JButton unten = new JButton(); //vor-/zurueck-Buttons
	JPanel flaeche = new JPanel(); //Bildflaeche

	
	public Grafik(JRootPane appletroot, URI appletpfad) {
		this.setRootPane(appletroot);
	}
		
	public void startGrafik() {
		
		this.getRootPane().getLayeredPane().setBounds(0, 0, 890, 490);
		this.getRootPane().getLayeredPane().setLayer(mycontainer, 30000);
		this.getRootPane().getLayeredPane().add(mycontainer, 30000);

		mymenu.add(mymenuitem);
		mybar.add(mymenu);

		mycontainer.setLayout(mylayout); 
		
		mittescroll.setPreferredSize(new Dimension(30, 250));
		
		oben.setBackground(Color.YELLOW);
		wahl.setBackground(Color.CYAN);
		mitte.setBackground(Color.GREEN);
		unten.setBackground(Color.BLUE);
		flaeche.setBackground(Color.RED);
		wahl.add(wahlbox);
		
		gridbagHelfer(0, 0, 1, 1, 0.1, 0.01, mybar);
		gridbagHelfer(0, 1, 1, 1, 0.1, 0.5, oben);
		gridbagHelfer(0, 2, 1, 1, 0.1, 0.01, wahl);
		gridbagHelfer(0, 3, 1, 1, 0.1, 0.39, mittescroll);
		gridbagHelfer(0, 4, 1, 1, 0.1, 0.1, unten);
		gridbagHelfer(1, 0, 1, 5, 0.9, 0, flaeche);
		
		this.validateTree();
	}
	
	
	//Hilfsmethode fuer GridBagLayout
	private void gridbagHelfer(int _gridx, int _gridy, int _gridwidth, int _gridheight, double _weightx, double _weighty, JComponent komponente) {
		mycons.gridx = _gridx; //welche Stelle beginnt Zelle (x-Achse)
		mycons.gridy = _gridy; //welche Stelle beginnt Zelle (y-Achse)
		mycons.gridwidth = _gridwidth; //ueber wieviel Felder ragt die Zelle (x-Achse)
		mycons.gridheight = _gridheight; //ueber wieviel Felder ragt die Zelle (y-Achse)
		mycons.weightx = _weightx; //die Gewichtung relativ zu den anderen Zellen (x-Achse)
		mycons.weighty = _weighty; //die Gewichtung relativ zu den anderen Zellen (y-Achse)
		mycons.fill = GridBagConstraints.BOTH; //der restliche Platz wird mit Komponente gefuellt	
		mylayout.setConstraints(komponente, mycons);	
		mycontainer.add(komponente);
		
	}
	
	
	//Extra-Klasse fuer JPanel wegen paintComponent
	public class myJPanel extends JPanel {
		
		private static final long serialVersionUID = 3539041744270282816L;
		BufferedImage puffbild;
		
		public myJPanel(BufferedImage bufferimage) {
			puffbild = bufferimage;
		}
		
		public void paintComponent (Graphics g) {
			super.paintComponent(g);
			Graphics2D g2d = (Graphics2D) g;
			g2d.drawImage(puffbild, null, 0, 0);
		}	
	}
	
}
```
Wenn ich das starte, dann passiert nichts. Nur das Appletfenster erscheint mit weißem Inhalt. Keine Fehlermeldung.
Was mach ich falsch?

Gruß
Michael


----------



## shiny_hair (15. Apr 2006)

Hab's jetzt hinbekommen (Teilausschnitt):


```
class Grafik extends JFrame {
	
	Container mycontainer = new Container();
	BilderBuffern album = new BilderBuffern();
	myLayer myframeinhalt = new myLayer();
	
	public Grafik(Container appletcontentpane) {
		mycontainer = appletcontentpane;
	}
		
	public void startGrafik() {
		mycontainer.add(myframeinhalt);
	}
	
	class myLayer extends JLayeredPane {
		
		private static final long serialVersionUID = 1107922248478421835L;
		GridBagLayout mylayout = new GridBagLayout();
		GridBagConstraints mycons = new GridBagConstraints();
		Ordner myOrdner;
		JMenuBar mybar = new JMenuBar();
		JMenu mymenu = new JMenu("Menü");
		JMenuItem mymenuitem = new JMenuItem("About");
		JPanel oben = new JPanel(); //für Bildvorschau
		JPanel wahl = new JPanel(); //ComboBox für Ordnerwahl
		JComboBox wahlbox = new JComboBox();
		JList mitte = new JList(); //für Bildliste
		JScrollPane mittescroll = new JScrollPane(mitte); //zum Scrollen der JList
		JButton unten = new JButton(); //vor-/zurueck-Buttons
		JPanel flaeche = new JPanel(); //Bildflaeche
		
		
		public myLayer() {
			this.setLayout(new GridBagLayout());
			myOrdner = new Ordner(); //Liste der verfügbaren Bilder holen
			basisFlaeche();
		}
		
		public void basisFlaeche() {
		
		
			mymenu.add(mymenuitem);
			mybar.add(mymenu);

			mittescroll.setPreferredSize(new Dimension(30, 250));
						
			oben.setBackground(Color.YELLOW);
			wahl.setBackground(Color.CYAN);
			mitte.setBackground(Color.GREEN);
			unten.setBackground(Color.BLUE);
			flaeche.setBackground(Color.RED);
			
			gridbagHelfer(0, 0, 1, 1, 0.1, 0.01, 0, mybar, 1);
			gridbagHelfer(0, 1, 1, 1, 0.1, 0.5, 0, oben, 1);
			gridbagHelfer(0, 2, 1, 1, 0.1, 0.01, 0, wahl, 1);
			gridbagHelfer(0, 3, 1, 1, 0.1, 0.39, 0, mittescroll, 1);
			gridbagHelfer(0, 4, 1, 1, 0.1, 0.1, 0, unten, 1);
			gridbagHelfer(1, 0, 1, 5, 0.9, 1, 0, flaeche, 1);		
			wahl.add(wahlbox);
		}
		
		BorderLayout myborder = new BorderLayout(10, 10);
		myPopupJPanel testflaeche = new myPopupJPanel();
		JButton popupbutton = new JButton("Schließen");
		
		public void popUp() {
			testflaeche.setOpaque(false);
			testflaeche.setLayout(myborder);
			gridbagHelfer(0, 0, 2, 5, 1, 1, 20, testflaeche, 400);
			this.setLayer(testflaeche, new Integer(400));			
			this.validate();
		}
		
		//Hilfsmethode für GridBagLayout
		private void gridbagHelfer(int _gridx, int _gridy, int _gridwidth, int _gridheight, double _weightx, double _weighty, int _insets, JComponent komponente, int layerwert) {
			mycons.gridx = _gridx; //welche Stelle beginnt Zelle (x-Achse)
			mycons.gridy = _gridy; //welche Stelle beginnt Zelle (y-Achse)
			mycons.gridwidth = _gridwidth; //ueber wieviel Felder ragt die Zelle (x-Achse)
			mycons.gridheight = _gridheight; //ueber wieviel Felder ragt die Zelle (y-Achse)
			mycons.weightx = _weightx; //die Gewichtung relativ zu den anderen Zellen (x-Achse)
			mycons.weighty = _weighty; //die Gewichtung relativ zu den anderen Zellen (y-Achse)
			mycons.insets = new Insets(_insets, _insets, _insets, _insets);
			mycons.fill = GridBagConstraints.BOTH; //der restliche Platz wird mit Komponente gefuellt	
			
			this.addImpl(komponente, mycons, layerwert); //addImpl notwendig wegen Constraints
			this.setLayer(komponente, new Integer(layerwert));
		}	
		

		//Extra-Klasse für JPanel wegen paintComponent
		public class myJPanel extends JPanel {
			
			private static final long serialVersionUID = 3539041744270282816L;
			BufferedImage puffbild;
			BufferedImageOp myop;
			
			public myJPanel(BufferedImage bufferimage) {
				puffbild = bufferimage;
				this.setBounds(0, 0, puffbild.getWidth(),puffbild.getHeight()); //loeschen
			}
			
			public void paintComponent (Graphics g) {
				super.paintComponent(g);
				Graphics2D g2d = (Graphics2D) g;
				g2d.setClip(0 ,0, puffbild.getWidth(), puffbild.getHeight());
				//g2d.transform(new AffineTransform(40d, 0, 0,40d,0,0));
				
				g2d.drawImage(puffbild, null, 0, 0);
			}	
		}
		
		//Extra-Klasse (halbtransparent) für Popup-JPanel wegen paintComponent
		public class myPopupJPanel extends JPanel {
			
			private static final long serialVersionUID = 8782249918175277703L;
		
			public myPopupJPanel() {
		
			}
			
			public void paintComponent (Graphics g) {
				super.paintComponent(g);
				Graphics2D g2d = (Graphics2D) g;
				g2d.setColor(new Color(3, 65, 27, 210));
				g2d.fill3DRect(0, 0, 850, 450, true);
			}	
		}
				
	}		
}
```


----------

