JPanel auf JFrame neu zeichnen

Riedelinho

Mitglied
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.

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

Java:
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.

Java:
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
Java:
sidebarleft.repaint()
versucht, aber ohne erfolg.
auch mit
Java:
.validate()
hat es irgendwie nicht funktioniert.
Kann mir jmd helfen und vielleicht sagen, wo mein Denkfehler ist?

Liebe Grüße
Riedelinho
 
wenn ich
Java:
mainFrame.remove(sidebarleft);
hinter die initialisierung schreibe krieg ich eine
Java:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
was mach ich falsch?

Kompletter Code:

Java:
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...
 
Zuletzt bearbeitet:
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
 
ich hab da jetz folgenden code:
Java:
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
 
Moin,

ich hab da jetz folgenden code:
Java:
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();

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
Java:
jPanel mySidebarleft2 = new SideBarLeft(2);

Gruß
Klaus
 
Zuletzt bearbeitet:
es tritt tatsächlich in der remove aktion auf:
Java:
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
 
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
 
Java:
JPanel sidebarleft = null;
In der Klasse als globale Variable
Java:
JPanel sidebarleft = new SideBarLeft(1);
Hier als sie beim ersten aufruf der gui initialisiert wird
Java:
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...
 
ok hab grad mim kumpel den fehler gefunden ^^

Java:
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 🙂
 

Zurück
Oben