# Label auf Label oder Panel auf Label



## Transmitter (20. Aug 2004)

Hi 

Ich habe ein Panel (East), es legt die Größe fest.
Darauf sitzt ein Label (LabelEast), weil das ganze eine Hintergrundgrafik hat.

Jetzt soll aber auf diesem Label eine Navigation sitzen, und die kann sich von Ansicht zu Ansicht ändern.
Also wollte ich diese Navigation in eine extra Klasse packen, und je nachdem, welcher Button geklickt wurde soll dann die entsprechende geladen werden.

Kann ich diese Navigation auslagern?
Und wie muss diese Navigation dann ausgebildet sein? Als Label, als Panel oder wie?
Und wie kann ich diese Navigation dann in mein LabelEast setzen?
Und geht das auch mit VE für Eclipse? Der versetzt mir das Label dann sehr komisch, über das LabelEast und nicht drauf. 

Danke schon mal 
Bye, Transmitter


----------



## L-ectron-X (20. Aug 2004)

Grundsätzlich ist es so, dass Labels keine weiteren GUI-Komponenten aufnehmen können, dafür sind die Panel da.


----------



## Transmitter (23. Aug 2004)

L-ectron-X hat gesagt.:
			
		

> Grundsätzlich ist es so, dass Labels keine weiteren GUI-Komponenten aufnehmen können, dafür sind die Panel da.



Wie schaffe ich es denn ein Panel mit einer Grafik zu füllen wie ein Label, nur, dass auf das Panel noch ein kleineres Panel drauf soll?


----------



## foobar (23. Aug 2004)

Du kannst dem Panel auch wieder ein Panel oder ein Label zuweisen.


----------



## Transmitter (23. Aug 2004)

Hmm .. aber dann kalppt es nicht mein Label unter dem 2. Panel liegen zu haben .. 
Doof zu erklären .. 

Ansicht von oben:

Button
PanelNavi
Label mit Hintergrundgrafik, genauso groß wie PanelNorth
PanelNorth

So soll das ungefähr aussehen .. 
und mein Code dazu:


```
private JPanel getJPanelNorth ( )
    {
        if ( jPanelNorth == null )
        {
            jLabel = new JLabel();
            jPanelNorth = new JPanel ( );
            jPanelNorth.setPreferredSize ( new java.awt.Dimension ( 1024, 56 ) );
            jLabel.setText("JLabel");
            jLabel.setPreferredSize(new java.awt.Dimension(1024,56));
            jPanelNorth.add(jLabel, null);
            jPanelNorth.add(getJPanel(), null);
        }
        return jPanelNorth;
    }

	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setPreferredSize(new java.awt.Dimension(200,40));
			jPanel.add(getJButton(), null);
		}
		return jPanel;
	}
	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */    
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setText("Test");
			jButton.setPreferredSize(new java.awt.Dimension(59,20));
		}
		return jButton;
	}
```

Dabei komme ich nicht weiter.
Am besten wäre es, wenn das jPanelNorth eine Hintergrundgrafik aufnehmen könnte :-/
Hoffe, das kann man auch anders lösen?

Kann man nicht irgendwie einstellen, auf welcher "Ebene" ein Label liegen soll?

Bye, Transmitter


----------



## Beni (23. Aug 2004)

Ein Panel lässt sich ganz einfach erweitern:

```
public class BackgroundPanel extends JPanel{
  private Image image = ...

  public void paintComponent( Graphics g ){
    g.drawImage( 0, 0, image, this );  // hm, die Reihenfolge der Argumente ist so ähnlich :-)
  }
}
```
Einfach die Methode "paintComponent" überschreiben, und du hast ein Hintergrundbild.


----------



## Transmitter (23. Aug 2004)

Image ist doch abstrakt, die Klasse kann ich doch nicht instanzieren :-/

Und bei drawImage bekomme ich die Fehlermeldung, dass meine Parameter Typen nicht stimmen würden:

public abstract boolean drawImage(Image img,
                                  int x,
                                  int y,
                                  Color bgcolor,
                                  ImageObserver observer)

Bzw. .. die Methode ist ja auch abstrakt, irgendwie verstehe ich das nicht so richtig, könntest du da ein paar Zeilen Code mehr posten?

Dankeschön


----------



## Beni (23. Aug 2004)

Ok, ich habs nochmal nachgelesen, eigentlich wollte ich die Methode verwenden.

Stell dir folgendes vor: es gibt eine abstrakt Klasse "Kleidungsstück", und die Klasse "Socke extends Kleidungsstück". Ein Socke kannst du in jedem Laden kaufen (=instanziieren), eine "Kleidungsstück" nicht ("guten Tag, ich würde gern 3 Paar Kleidungsstück kaufen!"  :autsch: ). Nichtsdestotrotz existieren Kleidungsstücke, z.B. in der Form von Socken. Und es gibt einige Sachen die man mit Kleidungsstücken machen kann, z.B. waschen oder anziehen. Das sind Aktionen (=abstrakte Methoden :wink, die eindeutig zu einem Kleidungsstück gehören (ein Kleidungsstück das man nicht anziehen kann ist kein Kleidungsstück...), auch wenn man eine Socke anders anzieht, als eine Hose.

Genauso verhält es sich mit Image (und auch mit Graphics). Es gibt Images, nur kann man sie nicht direkt herstellen. Es gibt Methoden die irgendwas zeichnen, nur ist noch nicht genau bestimmt, wie sie das machen.

Ein Methode ein Bild herzustellen geht so: (siehe unten), wie das Graphics g zeichnet, interessiert uns nicht.

```
Image image = createImage();

public static Image createImage(){
  BufferedImage img = new BufferedImage( 100, 100, BufferedImage.TYPE_ING_RGB );
  Graphics g = img.createGraphics(); // Wir verlangen etwas zum zeichnen.
  g.setColor( Color.GREEN );  // Wie funktioniert das intern? Das kann uns egal sein, hauptsache es funktioniert.
  g.fillOval( 0, 0, 100, 100 );
  g.dispose(); // brauchen wir nicht mehr.
  return img;
}
```



```
public class BackgroundPanel extends JPanel{
  private Image image = ... // zum Beispiel das "createImage()" von oben.

  public void paintComponent( Graphics g ){
    g.drawImage( image, 0, 0, this ); // das ist die bessere Reihenfolge
  }
}
```


----------



## Transmitter (23. Aug 2004)

Dankeschön, das funktioniert 

Jetzt muss ich nur noch sehe, wie ich das mit einer Grafik umsetze, aber das bekomme ich sicherlich hin 

Klasse, dankeschön nochmal


----------

