Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[Java] Tabs herladen bij een changeListener

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo allemaal,

Ik heb een JTabbedPane met verschillende tabs. Elke tab bestaat uit een JComponent dat een JEditorPane is. Nu wil ik het zo krijgen dat telkens ik verwissel van tab het systeem dat component volledig gaat herschrijven (een update met volledige nieuwe inhoud dus). De inhoud is volledig nieuw maar moet getoond worden in de tab met het component dat op dat moment geselecteerd is. Probleem is dus het updaten van het geselecteerde component hoe dat moet.

De volgende code gebruik ik om acties op te roepen bij het verwisselen van tab:
Java:
1
2
3
4
5
6
7
8
       tabbedPane.addChangeListener(new
                ChangeListener() {
                    public void stateChanged(ChangeEvent event) {
                        // int n = tabbedPane.getSelectedIndex();
                        // tabbedPane.getSelectedComponent();
                        loadTab(n);
                    }
        }); 


De functie loadTab ziet er als volgt uit:
Java:
1
2
3
private void loadTab(int n) {
  // Hier komt dan de implementatie om dat specifieke tabje te vernieuwen
}


De componenten worden gemaakt in een aparte functie en eigenlijk moeten ze dus bij het verwisselen van tabs opnieuw worden aangemaakt door dezelfde methode. Deze methode haalt een xml file op, maar deze is inhoudelijk telkens anders, dus daarom moet de tab content worden bewerkt.

Ik heb al geprobeerd om een Refreshable interface te implementeren maar dat zoek ik eigenlijk niet en het werkt trouwens ook niet.

Het zou me enorm plezieren moesten jullie me op weg helpen want ik weet niet waar te beginnen.

Kris

[ Voor 0% gewijzigd door Verwijderd op 25-02-2008 22:50 . Reden: topic titel vergeten! ]


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 09:15

NetForce1

(inspiratie == 0) -> true

Wat is er mis met een Refreshable interface implementeren (en waarom zou het niet werken)?
Tab vervangen lijkt me ook niet zo ingewikkeld:
Java:
1
2
3
tabbedPane.removeTabAt(n);
Component tabContent = createTab(n);
tabbedPane.insertTab(title, icon, tab, tip, n);

Als je probleem ingewikkelder ligt, dan zul je toch wat meer uitleg moeten geven denk ik.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Verwijderd

Topicstarter
Dat lijkt inderdaad een mooie oplossing te zijn, ik heb nu het volgende.

Java:
1
2
3
4
5
6
7
8
9
private void loadTab(int n) {
        // publictimeline
        if(n == 0) {
            tabbedPane.removeTabAt(n);
            JComponent publicTimelinePanel = makeTextPanel(1);
            tabbedPane.insertTab("Public Timeline", publicTimelineIcon, createScrollPane(publicTimelinePanel), "Does nothing", n);
            
            } 
}


Probleem hierbij is, dat telkens ik dus op tab vier bijvoorbeeld ga staan en dan terug naar tab 0 ga, ik een onneindige lus krijg. De functie loadTab() wordt vier keer aangeroepen en ik heb absoluut geen idee hoe dat zomaar kan.
Hij blijft telkens loadTab herhalen waardoor er iedere keer opnieuw een makeTextPanel() wordt aanroepen. Heeft iemand hier een verklaring voor? Mijn debuggen helpt me niet vooruit.

[ Voor 17% gewijzigd door Verwijderd op 26-02-2008 11:59 . Reden: analyse gaf nieuwe inzichten ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 13:37

Robtimus

me Robtimus no like you

Zodra jij de huidige tab verwijderd, dan schakelt de JTabbedPane automagisch door naar een andere. Daarbij wordt dan natuurlijk ook weer een ChangeEvent gegenereerd, etc. Dit zou stoppen als jij maar geen tabs bleef toevoegen.

Hoe ik dit zelf vaak oplos is een boolean flag gebruiken. Initieel is deze false, en zodra ik code ga uitvoeren die events zou genereren zet ik hem op true, voer de code uit, en zet hem weer op false. In alle listeners doe ik bovendien niks als die flag true is.

Dus in jouw geval:
Java:
1
2
3
4
5
6
7
8
9
10
public void stateChanged(ChangeEvent event)
{ 
    if (!blockEvents)
    {
        int n = tabbedPane.getSelectedIndex(); 
        blockEvents = true;
        loadTab(n); 
        blockEvents = false;
    } 
}

Als loadTab(n) dan voor events zorgt staat blockEvents op true, en worden dus alle andere ChangeEvents genegeerd, totdat loadTab(n) afgerond is en blockEvents weer false wordt.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Marcj
  • Registratie: November 2000
  • Laatst online: 16:32
Wat is er mis met de setComponentAt() functie van de JTabbedPane? Dan heb je dit probleem ook niet.