# JPanel aktualisieren mit validate() !



## Bw4n4 (17. Jan 2007)

Hi, 
hatte den Post schon in einem vorhandenen Thread gepostet, aber an dem war leider schon ein Häckchen dran, deswegen hat ihn scheints keiner mehr beachtet...

.....

hab per forensuche den Code hier gefunden, er funktioniert auch, aber mein contentPane repaintet sich plötzlich nicht mehr nach dem Doppelklick. Das neue JPanel wird erst angezeigt wenn ich z.B. die Fenstergröße ändere. 

Komischerweise reicht bei allen meinen anderen Fenstern der Aufruf von validate() aus um den Inhalt neu zu zeichnen !!

Liegt es daran, dass ich validate() innerhalb des MouseEvent aufrufe?

Warum krieg ich ne NullpointerException wenn ich getRootPane().validate() oder getRootPane().getContentPane.validate() aufrufe? Was spricht dagegen?


Hier der Code:


```
class blabla extends JPanel
{
......	

resultTablejTable = new JTable();
            TableModelSearchCustomer model = new TableModelSearchCustomer(rowData);
            resultTablejTable.setModel(model);

resultTablejTable.addMouseListener( new MouseAdapter()
            {
                 public void mouseClicked( MouseEvent doubleClick )
                 {
                      if( doubleClick.getClickCount() == 2 )
                      {
                         int rowClicked = resultTablejTable.rowAtPoint(doubleClick.getPoint());
                         int customerID = (Integer)resultTablejTable.getValueAt(rowClicked, 0);
                         JPanel changeCustomerGUI = new ChangeCustomerGUI(_server, customerID);
                          getRootPane().setContentPane(changeCustomerGUI);
                          validate();
                      }
                   
                 }
                });   
}
}
```


Danke schon mal;
Werd echt oft fündig hier, wenn ich auf Probleme stoß *thumbs up*


----------



## SlaterB (17. Jan 2007)

ich versteh nur Bahnhof
->
http://www.java-forum.org/de/viewtopic.php?p=171842#171842


----------



## Bw4n4 (18. Jan 2007)

is doch gar nicht so schwer,

da ist ne Tabelle => da gibts Zeilen drin ;-)
wenn ich auf eine Zeile doppelklicke, wird eine neue Instanz einer Klasse erstellt, die von JPanel erbt.
Dieses neue JPanel soll jetzt neuer contentPane werden, also die Tabelle ersetzen.
Jetzt muss das ganze nur noch neu gezeichnet werden (damit man auch den neuen Inhalt sehen kann).
In anderen Teilen der GUI ging das wunderbar mit validate() nach dem setContentPane(neues JPanel), nur in obig beschriebenem Fall wird der neue Inhalt des Fensters erst sichtbar wenn ich dessen Größe ändere. ich würde gerne wissen warum und auf welche weise sonst ich den contentPane refreshen kann ?


----------



## SlaterB (18. Jan 2007)

das hast du schon erzählt, ja,

aber ich kann mir in meinem Kopf nicht alle Vorgänge vorstellen, gar die Lösung im Schlaf ertasten,
daher bitte Code


----------



## Bwana (19. Jan 2007)

ok dann hier halt ein tolles KSKB:



```
public class Main {

	public static void main(String[] args) {


		MyWindow myWindow = new MyWindow();
		myWindow.setVisible(true);

	}

}
```


Die Klasse mit dem Fenster die von JFrame erbt


```
import javax.swing.JFrame;
import java.awt.Dimension;

public class MyWindow extends JFrame {
	
	public MyWindow()
	{
		super();
		setSize(new Dimension(300, 300));
		setContentPane(new MyContent());
	}
}
```

Hier der erste Content mit der Tabelle in der man doppelklicken kann

```
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JPanel;
import javax.swing.JTable;


public class MyContent extends JPanel {

	
	private String data[][] = 
	{
			{"Max" , "Mustermann" , "Musterstraße 1a" }		
	};
	private MyModel model = new MyModel(data); 
	private JTable resultjTable = new JTable(model);
	
	public MyContent()
	{
		setLayout(new FlowLayout());
		add(resultjTable);

		resultjTable.addMouseListener( new MouseAdapter()
		{
			  public void mouseClicked( MouseEvent doubleClick )
			  {
				    if( doubleClick.getClickCount() == 2 )
				    {
				    	JPanel myContent2 = new MyContent2();
		    	 		getRootPane().setContentPane(myContent2);
		    	 		validate(); // <------------------------------------------ Mein Problem
				    }
				  
			  }
			 });	
		
	}
}
```

Der 2. Content der nach dem Doppelklick eigentlich erscheinen sollte, dies aber erst tut, wenn man z.B. die Fenstergröße verändert. 

```
import javax.swing.JLabel;
import javax.swing.JPanel;


public class MyContent2 extends JPanel {


	private JLabel content2 = new JLabel("mein 2. Inhalt");
	
	public MyContent2()
	{
		add(content2);
	}
}
```

zu guter letzt noch das model für die tabelle aus content1

```
import javax.swing.table.DefaultTableModel;

public class MyModel extends DefaultTableModel {

	private Object[][] _data;
	private int length;
	
	public MyModel(Object[][] data)
	{
		super();
		try
		{
			_data = data;
			length = data.length;
		}
		catch(NullPointerException npe)
		{
			
		}
		
	}
	
	public int getRowCount()
	{
		return length;
	}
	
	public String getColumnName(int column)
	{
	      switch(column)
	      {
	      case 0: return "Vorname";
	         case 1: return "Nachname";
	         case 2: return "Geburtsdatum";
	         default: return null; 
	         
	      }
	}
	      
	public int getColumnCount()
	{
		return 3;
		
	}
	
	public Object getValueAt(int row, int col)
	{		
		return _data[row][col];
		 
	}
	
    public boolean isCellEditable(int row, int column)
    {
       return false;
    }    
	
}
```

Das Beispiel sollte komilierbar sein und zeigt, dass er den contentPane erst von content1 auf content2 umstellt, wenn man z.B. die Fenstergröße ändert...
nochmal meine frage: wie kann ich das repainten ?

MFG
Bwana


----------



## SlaterB (19. Jan 2007)

bisschen groß für ein KSKB ,
gehts nur bei JTable nicht und sonst schon oder wie?

ich hab jetzt allerdings einfach nur 

```
JRootPane rp = getRootPane();
rp.setContentPane(myContent2);
rp.validate();
```
getestet und schon ging es bei mir..,
sorry wenn's dann viel Lärm um kleine Änderung war


----------



## Guest (20. Jan 2007)

jo ging nur bei dem doppelklick in nem JTable nich, ansonsten schon ;-)

jetzt funktionierts wunderbar !! :toll: 

aber warum krieg ich ne exception wenn ich direkt getRootPane().validate() aufrufe,
aber krieg keine und alles läuft gut wenn ich den Aufruf vorher in ne Variable rp packe ? nur so zum verständnis...

thx nochmal


----------



## Bwana (20. Jan 2007)

verflickst, warum vergess ich immer mich einzuloggen...
=> Häckchen ;-)


----------



## Beni (2. Jan 2008)

Anonymous hat gesagt.:
			
		

> aber warum krieg ich ne exception wenn ich direkt getRootPane().validate() aufrufe,
> aber krieg keine und alles läuft gut wenn ich den Aufruf vorher in ne Variable rp packe ? nur so zum verständnis...



Weil "rp.setContentPane(myContent2); " den Baum der Componenten verändert: da das RootPane nur ein ContentPane haben kann, wird das alte ContentPane entfernt. Deine Tabelle ist aber auf dem alten ContentPane, das nun keinen Vater mehr hat... deshalb führt "getRootPane" ins Leere.


----------

