Verschwindende JComboBox (Problem mit Remove?)

Status
Nicht offen für weitere Antworten.

sg181

Mitglied
Hallo Leute.

Habe ein merkwürdiges Problem mit einer JComboBox, hoffe mir kann jemand helfen.
Erstmal der Aufbau meines Formulars: ein JFrame, auf den ich ein JPanel draufpacke, daß jedoch je nach einer vorherigen Auswahl immer anders aussieht.

Hiermal der relevante Code:

Code:
public DBEditor extends JFrame
{
    public DBEditor()
    {
        setExtendedState(MAXIMIZED_BOTH);
        setResizable(false);
        getContentPane().setLayout(null);

        JComboBox comTabelle = new JComboBox(namen);
        comTabelle.setBounds(105,5,150,20);
        comTabelle.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt)
        {
            if (!starting)
                initTEditor(((JComboBox)evt.getSource()).getSelectedIndex()+1);
        }
    });
    getContentPane().add(comTabelle);

    initTEditor(6);

    starting = false;
}

    void initTEditor(int index)
    {
        if (!starting)
        {
            getContentPane().remove(tEditor);
            repaint();
        }
	
        if (index == 1)
            return;
        else if (index == 2)
            return;
        else if (index == 3)
            return;
        else if (index == 4)
            return;
        else if (index == 5)
            tEditor = new PVariantenEditor();
        else if (index == 6)
            tEditor = new TalenteEditor();
        else if (index == 7)
            tEditor = new VorteileEditor();
        else if (index == 8)
            tEditor = new NachteileEditor();
        else if (index == 9)
            tEditor = new SonderfertigkeitenEditor();
        else
            return;
	
        getContentPane().add(tEditor);
        repaint();
    }
}

class TabellenEditor extends JPanel
{
    String tName;

    public TabellenEditor(String s)
    {
        this.tName = s;
        
        cModelDatensatz =  new DefaultComboBoxModel(daten);
        comDatensatz = new JComboBox(cModelDatensatz);
        comDatensatz.setBounds(90,5,200,20);
        comDatensatz.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt)
            {
                actID = comDatensatz.getSelectedIndex();
                if (actID == 0)
                    clearMask();
                else
                    loadValues(actID);
            }
        });
        add(comDatensatz);
    }
}

Kurz zur Erklärung: die Klassen PVarianten-, Talente-, Vorteile-, Nachteile- und SonderfertigkeitenEditor sind alles Unterklassen der Klasse TabellenEditor.
Ich habe versucht, nur den relevanten Code zu posten: alle Variablen sind definiert, auch wenn der entsprechende Code hier vielleicht fehlt.

Jetzt mein Problem: beim Start des Programms läuft alles optimal, der erste Aufruf von initTEditor klappt also.
Wenn ich aber danach die ComboBox comTabelle benutze sollte ja eigentlich ein neuer tEditor erzeugt werden.
Das geschieht auch, jedoch sind die entsprechenden ComboBoxen nicht mehr zu sehen. Sie sind zwar noch da, wie ein Click auf die entsprechende Stelle beweist, aber die Umrandung (und der Dropdown-Pfeil) des Hauptfeldes fehlen.
Daher könnte es vielleicht sein, daß das Problem mit der Zeile

Code:
getContentPane().remove(tEditor);

zusammenhängt? Alle anderen Komponenten werden jedoch richtig angezeigt.

Ich hätte noch ein Bild, daß mein Problem zeigt, kann es aber nirgendwo hochladen, aber schicke es gerne per Mail.

Hoffe mir kann jemand helfen. Vielleicht gibt es ja auch eine Möglichkeit, den remove-Befehl zu vermeiden?

Danke schon mal,
sg181
 
Konnte das Problem noch weiter....naja, definieren.
Es liegt vermutlich doch nicht am Remove.

Auf einer der Panels hab ich eine JCheckBox.
Wenn ich diese aktiviere, werden 2 TextBoxen eingeblendet.

Wenn ich dies mache, erscheinen auch die fehlenden Rahmen der ComboBoxen. Es scheint wohl an dem einblenden der Textboxen zu liegen, den eine andere CheckBox ohne ActionListener führt nicht zu dem Ergebnis.

Hier der ActionListener der CheckBox
Code:
chkMultiple.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt)
    {
        lblMin.setVisible(!lblMin.isVisible());
        txtMin.setVisible(!txtMin.isVisible());
        lblMax.setVisible(!lblMax.isVisible());
        txtMax.setVisible(!txtMax.isVisible());
    }
});

Vielleicht ein Fehler des repaints()?
 
Ich habe eine provisorische Lösung gefunden, obwohl ich immer noch nicht ganz verstehe, wo das Problem herkommt.

Das Ganze funktioniert, wenn man das JPanel zuerst auf unsichtbar schaltet, und erst nach dem hinzufügen zum Frame sichtbar macht.

Code:
tEditor.setVisible(false);
getContentPane().add(tEditor); 
repaint(); 
tEditor.setVisible(true);
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben