# JLabel nicht sichtbar



## Malcolm X (12. Dez 2005)

Hallo,

warum ist das JLabel nicht zu sehen. Ist es möglich in einem Panel sowohl JLabels als auch Methoden der Klasse Graphics zu platzieren?


```
import javax.swing.*;

public class Test extends JFrame
{
	public Test()
	{
		JLabel test = new JLabel("Test");
		Panel panel = new Panel();
		panel.add(test);
		this.add(panel);
		this.setVisible(true);
		this.setSize(200,200);
	}
	
	
	public static void main(String[] args) 
	{
		Test test = new Test();
	}
}
```


```
import java.awt.Graphics;

import javax.swing.*;

public class Panel extends JPanel
{
	public void paint(Graphics g)
	{
		super.paintComponent(g);
	}
}
```


----------



## Sky (12. Dez 2005)

1. setVisible erst nach setSize aufrufen

2. paintComponent in deiner Panel-Klasse malt "nur" das Panel, nicht seine Komponenten; also paintComponents muss auch aufgerufen werden...

3. Der Name Panel ist ungeschickt, weil's den schon gibt... auch wenn es Dir in deinem Fall keine Probleme macht.

4. So wie Du deine paint-Methode überschreibst ist auch nicht gerade sinnvoll... was ist eigentlich dein Ziel ?


----------



## freez (12. Dez 2005)

Vielleicht ist Zeile 11 auch dein Problem:


```
this.getContentPane().add()
```

könnte zur Lösung beitragen.


----------



## Sky (12. Dez 2005)

freez hat gesagt.:
			
		

> Vielleicht ist Zeile 11 auch dein Problem:
> 
> 
> ```
> ...


Hinweis: Ab Java 1.5 ist der Aufruf von getContentPane() nicht mehr nötig.


----------



## Malcolm X (12. Dez 2005)

Ich wäre für ein kleines Beispiel dankbar. z.B. zwei JLabel die durch eine Linie (g.drawLine()) verbunden sind


----------



## Sky (12. Dez 2005)

ohne es getestet zu haben:


```
class LabelWithLinePanel extends JPanel {

  private JLabel label1 = new JLabel("the Label 1");
  private JLabel label2 = new JLabel("the Label 2");

  public LabelWithLinePanel() {
    this.add( label1 );
    this.add( label2 );
  }
  
  public void paint( Graphics g ) {
    super.paint(g);
    g.setColor( Color.red );
    int x1 = label1.getLocation().x;
    int x2 = label2.getLocation().x + label2.getSize().width;
    int y1 = label1.getLocation().y + ( label1.getHeight() / 2 );
    int y2 = label2.getLocation().y + ( label2.getHeight() / 2 );
    g.drawLine( x1,y1,x2,y2 );
  }
}
```

Der Code sollte eine rote Linie vom ersten Label ganz links bis zum zweiten Label ganz rechts zeichnen.

Aufruf per 
	
	
	
	





```
myFrame.add( new LabelWithLinePanel() );
```


----------



## Malcolm X (12. Dez 2005)

Hallo,

danke für die Hilfe. Hat daran gelegen das ich die Methode super.paint(g); nicht aufgerufen habe. Kannst Du mir vielleicht noch kurz was genau diese Methode macht?


----------



## Sky (12. Dez 2005)

Malcolm X hat gesagt.:
			
		

> Hallo,
> 
> danke für die Hilfe. Hat daran gelegen das ich die Methode super.paint(g); nicht aufgerufen habe. Kannst Du mir vielleicht noch kurz was genau diese Methode macht?


super.paint(g) ruft die paint-Methode der Klasse auf, von der deine Klasse abgeleitet ist (also in meinem Bsp. JPanel). Das heißt, es werden alle Dinge erst gemalt, die JPanel malen würde und danach wird (nach Berechnung von x1 bis y2) die Linie gemalt


----------



## Malcolm X (12. Dez 2005)

Und was mach ich wenn die Labels nicht schon im Konstruktor sondern erst später zum Panel hinzugefügt werden sollen?
In dem Beispiel unten sind die Labels leider wieder nicht zu sehen.


```
class LabelWithLinePanel extends JPanel 
{
  private JLabel label1 = new JLabel("the Label 1");
  private JLabel label2 = new JLabel("the Label 2");

  public LabelWithLinePanel() 
  {
  }
 
  public void paint( Graphics g ) 
  { 
       super.paint(g);
       g.setColor( Color.red );
       g.drawLine( 10, 10, 50, 50 );
       this.add( label1 );
       this.add( label2 );   
  }
}
```


----------



## Illuvatar (12. Dez 2005)

1. ich vermute mal du musst danach noch validate() aufrufen
2. das kann aber generell so nicht gehen, du kannst die labels nur einmal adden und nicht jedesmal wenn das fenster neu gezeichnet wird.


----------



## Malcolm X (12. Dez 2005)

Das mit dem validate() klappt. Kannst Du mir sagen was validate() genau macht?


----------



## Sky (12. Dez 2005)

Ich würde versuchen, diese nicht gerade in der paint-Methode hinzuzufügen; paint wird jedes mal aufgerufen, wenn man mit der Maus über das Window fährt, maximiert, Größe ändert usw.... 



			
				Die API zu Container hat gesagt.:
			
		

> The validate method is used to cause a container to lay out its subcomponents again. It should be invoked when this container's subcomponents are modified (added to or removed from the container, or layout-related information changed) after the container has been displayed.


----------

