# JPanel auf JFrame neu zeichnen



## Riedelinho (11. Jan 2011)

Ich hab folgendes Problem:

Ich bin am GUI entwerfen für ein Programm und das PRoblem ist, dass wenn ich aus einem DropDown Menü einen Menüpunkt auswähle, er ein anderes Menü (das bisher aus testgründen aus buttons besteht) ändern bzw. neu zeichnen soll.


```
//Die linke SideBar
        JPanel sidebarleft = new SideBarLeft(1);
```
Hier wird die Sidebar mit den Anfangseinstellungen initialisiert (funktioniert auch soweit prima).


```
bausteineDropDown.addItemListener( new ItemListener() {
              public void itemStateChanged( ItemEvent e ) {
                JComboBox selectedChoice = (JComboBox)e.getSource();
                if ( selectedChoice.getSelectedItem().equals("Straße")){
                  System.out.println("klein");
                }
                else if (selectedChoice.getSelectedItem().equals("Fahrzeuge")){
                    System.out.println("test");
                    sidebarleft = new SideBarLeft(2);
                }
              }
            } );
        return bausteineDropDown;
```
Hier leg ich die benutzeroperationen fest, die passieren, wenn man einen entsprechenden Menüeintrag auswählt.


```
sidebarleft = new SideBarLeft(2);
```
Hier wird die neue sidebar initialisiert. Das System.out funktioniert auch prima an der stelle.
Nur mein Problem ist, wie zeichne ich jetz das Panel neu? Oder muss ich da komplette JFrame neuzeichnen?
ich hab es schon mit 
	
	
	
	





```
sidebarleft.repaint()
```
 versucht, aber ohne erfolg.
auch mit 
	
	
	
	





```
.validate()
```
 hat es irgendwie nicht funktioniert.
Kann mir jmd helfen und vielleicht sagen, wo mein Denkfehler ist?

Liebe Grüße
Riedelinho


----------



## DerEisteeTrinker (11. Jan 2011)

Dir fehlt das entfernen des alten Panels und dann musst du das neue Panel wieder auf das Frame bringen mit add


----------



## Riedelinho (11. Jan 2011)

wenn ich 
	
	
	
	





```
mainFrame.remove(sidebarleft);
```
hinter die initialisierung schreibe krieg ich eine 
	
	
	
	





```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
```
 was mach ich falsch?

Kompletter Code:


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at view.GuiView$2.itemStateChanged(GuiView.java:123)
    at javax.swing.JComboBox.fireItemStateChanged(Unknown Source)
    at javax.swing.JComboBox.selectedItemChanged(Unknown Source)
    at javax.swing.JComboBox.setSelectedItem(Unknown Source)
    at javax.swing.JComboBox.setSelectedIndex(Unknown Source)
    at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(Unknown Source)
    at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
```
Das hieße ja, dass meine Componenten, die ich löschen will null ist oder?
aber ich hab sie doch initialisiert und sie wird doch sagar im frame richtig angezeigt...


----------



## DerEisteeTrinker (11. Jan 2011)

Nicht hinter der Initialisierung sondern davor.

Denn auf deinem Frame ist die Referenz auf das alte Panel hinterlegt und die Variable zeigt auch drauf. wenn du dem Frame dann sagst, dass er das Panel wegwerfen soll, nachdem du die Variable neu initialisiert hast, dann sucht er nach dem neuen Panel zu entfernen und das findet er natürlich nicht.

Sprich
1. Altes Panel löschen
2. Neues Panel initialisieren
3. Neues Panel hinzufügen zum Frame
4. Panel neu zeichnen


----------



## Riedelinho (11. Jan 2011)

ich hab da jetz folgenden code:

```
else if (selectedChoice.getSelectedItem().equals("Fahrzeuge")){
                    System.out.println("test");
                    mainFrame.remove(sidebarleft);
                    sidebarleft = new SideBarLeft(2);
                    addComponent(mainFrame, new GridBagLayout(), sidebarleft, 10, 2, 4, 2, 1, 1);
                    sidebarleft.repaint();
```

und kriege immer noch diese exception... :-/ und die taucht laut fehlermeldung, schon bei dem remove auf ???:L


----------



## VfL_Freak (11. Jan 2011)

Moin,



Riedelinho hat gesagt.:


> ich hab da jetz folgenden code:
> 
> ```
> else if (selectedChoice.getSelectedItem().equals("Fahrzeuge")){
> ...



In welcher dieser Zeilen tritt denn die Exception genau auf ? ???:L
Etwa hier : "mainFrame.remove(sidebarleft);" ???:L
Dann wäre Dein "sidebarleft" in der Tat null und könnte auch in der Zeile nicht reinitialisiert werden!

Ich denke aber mal, das "Eisteetrinker " meinte, Du solltes ein NEUES Objekt initialisieren 

```
jPanel mySidebarleft2 = new SideBarLeft(2);
```

Gruß
Klaus


----------



## Riedelinho (11. Jan 2011)

es tritt tatsächlich in der remove aktion auf:

```
mainFrame.remove(sidebarleft);
```
also müsste meine sidebar ja leer sein...
hab den rest vom code auch mal weggeschmissen, und der fehler ist definitiv an dieser stelle...
aber auch wenn ich die variable schon global initialisiere tritt dieser fehler auf ???:L


----------



## DerEisteeTrinker (11. Jan 2011)

Wenn du an der Stelle eine Nullpointer bekommst, dann solltest du überprüfen, ob du in der Variable die vormalige Referenz auf das Panel gespeichert hast. Die Variable zeigt ins Nirvana, weil du das Panel vllt setzt, aber nie in der Variable abspeicherst

Poste mal die Methoden bzw. Zeilen, wo du die Variable sidebarleft deklarierst und benutzt

@ VfL_Freak

er kann die Variable ruhig weiter benutzen, da brauch er keine extra Variable


----------



## Riedelinho (11. Jan 2011)

```
JPanel sidebarleft = null;
```
In der Klasse als globale Variable

```
JPanel sidebarleft = new SideBarLeft(1);
```
Hier als sie beim ersten aufruf der gui initialisiert wird

```
package view.panel;

import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JPanel;

public class SideBarLeft extends JPanel {

    public SideBarLeft(int i){
        
        GridLayout gl = new GridLayout(4,0);
        this.setLayout(gl);

        JButton button = null;
        JButton button2 = null;
        
        if (i == 1){
            button = new JButton("test 1.1");
            button2 = new JButton("test 1.2");
        }
        else if (i == 2){
            button = new JButton("test 2.1");
            button2 = new JButton("test 2.2");
        }
        else if (i == 3){
            button = new JButton("test 3.1");
            button2 = new JButton("test 3.2");
        }
        this.add(button);
        this.add(button2);
    }
}
```
und da die klasse die instanziiert wird...


----------



## SlaterB (11. Jan 2011)

kann mainFrame nicht null sein?


----------



## DerEisteeTrinker (11. Jan 2011)

> kann mainFrame nicht null sein?



ohne den SlaterB sieht man den Wald vor lauter Bäumen nicht

Setz mal einen Debug-Punkt in die Zeile wo der Fehler auftritt, debugge bis dahin und schau dir an, welche der Variablen null ist. Eine von beiden muss null sein.


----------



## Riedelinho (11. Jan 2011)

ok hab grad mim kumpel den fehler gefunden ^^


```
mainFrame = new JFrame();
```
war unteranderem mein fehler, dass ich in der init methode die variable nochmal angelegt hab und sie damit überschrieben habe ^^
mit der sidebar genau das gleiche, es haben also 2 wörter (JPanel und JFrame) zu dem umstand geführt ^^

danke euch trotzdem für die hilfen


----------

