Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42

    jTabbedPane selectedIndex non Cambia

    Salve ragazzi,
    ho un problema con questo componente in swing:
    ho creato un tabMain Nel quale sono presenti 3 tab (jPanel) ed il selectedInex dovrebbe passare da -1 a 0..n dove n è il numero di tab -1.
    Cioè se ho tre tab viene assegnato alla prima 0, alla seconda 1 e alla terza 2.
    Quindi sto usando uno switch per verificare In quale tab sono per aggiornare una tabella dinamicamente.
    Il problema è che quando seleziono un tab, selectedIndex non cambia!
    Eppure se verifico il numero di tab questo è uguale a 3.

    Inoltre questo parametro non cambia neanche si provassi a forzare attraverso il metodo setSelectedIndex all'evento del clic del mouse sul tab.
    Sicuramente sbaglio qualcosa… Quale porzione di codice potrebbe interessare? (Sto usando Netbeans, quindi la generazione del codice riguardante l'interfaccia grafica è automatico)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Il problema è che quando seleziono un tab, selectedIndex non cambia!
    Magari ho capito male io .... se vuoi fare "qualcosa" quando la selezione del tab cambia, basta che registri un ChangeListener sul JTabbedPane e getSelectedIndex() ti darà l'indice del tab che è stato appena selezionato.
    Altrimenti in qualunque altro momento (es. azione su un pulsante nel tab visibile), getSelectedIndex() ti darà comunque l'indice del tab "corrente".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    Hai capito benissimo… Mi scuso per la banalità della domanda… È la prima volta che uso swing.
    Comunque ora funziona, ti ringrazio.
    Pensavo fosse automatico (ed effettivamente Credo che lo sia), ma giustamente se non si specifica l'evento sul quale operare, Il programma non sa quando aggiornare il selectedIndex. Giusto?
    Il mio errore è stato quello di registrare l'evento "clic del mouse" sulle singole Tab, per cui avevo fatto qualcosa del tipo: clic su tab 1 -> jTabbedPane.setSelectedIndex(1).
    Ora invece Ho assegnato l'evento "clic del mouse" al jTabbedPane. Al verificarsi dell'evento viene chiamato un metodo che valuta il SelectedIndex.

    Grazie per avermi Aperto gli occhi

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Il programma non sa quando aggiornare il selectedIndex. Giusto?
    La proprietà "selectedIndex" (get/setSelectedIndex) rispecchia sempre e in qualunque momento l'indice del tab corrente/selezionato. A parte il caso particolare di valore -1 che come dice la documentazione "Returns -1 if there is no currently selected tab".

    Quindi che vuoi dire con "non sa quando aggiornare il selectedIndex" ?

    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Il mio errore è stato quello di registrare l'evento "clic del mouse" sulle singole Tab, per cui avevo fatto qualcosa del tipo: clic su tab 1 -> jTabbedPane.setSelectedIndex(1).
    Questo approccio sarebbe comunque inutile e troppo "dispendioso". Poi comunque cosa vuol dire "clic del mouse" sulle singole Tab" ? Intendi sulle "linguette" del tabbed pane? JTabbedPane non ha nulla per registrare MouseListener sulle singole "linguette"!
    O intendi sul componente contenuto nel tab? Sì, sul componente contenuto è tecnicamente possibile registrare un MouseListener ma avrebbe ancora meno senso e potrebbe essere comunque controproducente.

    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Ora invece Ho assegnato l'evento "clic del mouse" al jTabbedPane
    Cioè hai registrato un MouseListener sul JTabbedPane? E a che scopo?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    Sì, lo avevo fatto sulle linguette… So che era un procedimento inutile e poco producente, ma il selectedIndex restava sempre 0, Allora Stupidamente cercavo di forzarlo manualmente (Tra l'altro in modo errato).

    Con "Quando aggiornare" intendo la cattura dell'evento.

    codice:
    private void tabMainMouseClicked(java.awt.event.MouseEvent evt) {                                             lblMessage.setText("");
            refreshTable();
        }
    Ho scritto questo codice Al puro scopo di provare Un evento, poi mi sono accorto che c'è proprio un evento dedicato nella sezione "change"... Il changelistner per l'appunto. Con un mouselistner vengono sprecate sulle risorse perché ad ogni clic del mouse viene eseguito un "qualcosa" anche se si è nella stessa tab. Praticamente inutile.

    Grazie mille

    [EDIT]
    Come non detto… Con il changeListner mi viene restituito questo errore:
    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException    at tornei.GUI.refreshTable(GUI.java:568)
        at tornei.GUI.tabMainStateChanged(GUI.java:555)
        at tornei.GUI.access$200(GUI.java:19)
        at tornei.GUI$3.stateChanged(GUI.java:266)
        at javax.swing.JTabbedPane.fireStateChanged(JTabbedPane.java:416)
        at javax.swing.JTabbedPane$ModelListener.stateChanged(JTabbedPane.java:270)
        at javax.swing.DefaultSingleSelectionModel.fireStateChanged(DefaultSingleSelectionModel.java:132)
        at javax.swing.DefaultSingleSelectionModel.setSelectedIndex(DefaultSingleSelectionModel.java:67)
        at javax.swing.JTabbedPane.setSelectedIndexImpl(JTabbedPane.java:616)
        at javax.swing.JTabbedPane.setSelectedIndex(JTabbedPane.java:591)
        at javax.swing.JTabbedPane.insertTab(JTabbedPane.java:731)
        at javax.swing.JTabbedPane.addTab(JTabbedPane.java:798)
        at tornei.GUI.initComponents(GUI.java:319)
        at tornei.GUI.<init>(GUI.java:26)
        at tornei.GUI$8.run(GUI.java:634)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
        at java.awt.EventQueue.access$200(EventQueue.java:103)
        at java.awt.EventQueue$3.run(EventQueue.java:694)
        at java.awt.EventQueue$3.run(EventQueue.java:692)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
    BUILD SUCCESSFUL (total time: 6 seconds)[\CODE]
    Eppure con il semplice clic del mouse funzionava anche bene…

    Non lo capisco questo errore…
    Ultima modifica di MBdip; 10-06-2014 a 13:12

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    Avrò ritornato Qualche String null.
    Controllo e vi faccia sapere

    [EDIT]
    Ho controllato, effettivamente c'era qualche String null.
    Infatti Anche con ll'ascoltatore del clic del mouse, se la lista era vuota ritornava errore. Ho corretto ed ora quest'ultimo funziona anche con liste vuote però l'ascoltatore del cambio continua a restituire questo errore…

    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException    at tornei.GUI.refreshTable(GUI.java:554)
        at tornei.GUI.tabMainStateChanged(GUI.java:541)
        at tornei.GUI.access$100(GUI.java:19)
        at tornei.GUI$2.stateChanged(GUI.java:257)
        at javax.swing.JTabbedPane.fireStateChanged(JTabbedPane.java:416)
        at javax.swing.JTabbedPane$ModelListener.stateChanged(JTabbedPane.java:270)
        at javax.swing.DefaultSingleSelectionModel.fireStateChanged(DefaultSingleSelectionModel.java:132)
        at javax.swing.DefaultSingleSelectionModel.setSelectedIndex(DefaultSingleSelectionModel.java:67)
        at javax.swing.JTabbedPane.setSelectedIndexImpl(JTabbedPane.java:616)
        at javax.swing.JTabbedPane.setSelectedIndex(JTabbedPane.java:591)
        at javax.swing.JTabbedPane.insertTab(JTabbedPane.java:731)
        at javax.swing.JTabbedPane.addTab(JTabbedPane.java:798)
        at tornei.GUI.initComponents(GUI.java:310)
        at tornei.GUI.<init>(GUI.java:26)
        at tornei.GUI$7.run(GUI.java:620)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
        at java.awt.EventQueue.access$200(EventQueue.java:103)
        at java.awt.EventQueue$3.run(EventQueue.java:694)
        at java.awt.EventQueue$3.run(EventQueue.java:692)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
    BUILD SUCCESSFUL (total time: 1 second)
    In particolare la riga 554 è questa:
    codice:
    private void refreshTable() {
    
                    String elenco = "";
                    javax.swing.JTable table = null;
                    String s=Integer.toString(tabMain.getTabCount());
                    jLabel3.setText(s);
                    
                    switch (tabMain.getSelectedIndex()) {
                        case 0:
                            // Aggiorno elenco Giocatori
                            elenco = database.get_elenco_giocatori();
                            table = jTableGio;
                            //btnCancellaAutore.setVisible(nAutori > 0);
                            break;
                        case 1:
                            // Aggiorno elenco artisti
                            elenco = database.get_elenco_squadre();
                            table = jTableSqu;
                            //btnCancellaArtista.setVisible(nArtisti > 0);
                            break;
                        case 2:
                            // Aggiorno elenco libri
                            elenco = database.get_elenco_partite();
                            table = jTablePar;
                            //btnCancellaLibro.setVisible(nLibri > 0);
                            break;
                            
                    }
    
    
                    DefaultTableModel model = new DefaultTableModel();
                    if (table != null) {
                        table.setModel(model);
                        
                        String[] rows = elenco.split(System.getProperty("line.separator"));
                        String[] intestaz = rows[0].split("\t");
                                           
                        for (int x = 0; x < intestaz.length; x++) {
                            model.addColumn(intestaz[x]);
                        }
                        
                        for (int x = 1; x < rows.length; x++) {
                            String[] row = rows[x].split("\t");
                            model.addRow(row);
                        }
                    }
        }
    Che chiama questo metodo nella classe Database:
    codice:
    public String get_elenco_giocatori(){            return ag.stampa_elenco_giocatori();
            }
    Che infine chiama:
    codice:
    public  String stampa_elenco_giocatori(){        String S = "";
                        S+=Giocatore.GetIntestazione()+ System.getProperty("line.separator");
                for(int i = 1; i < giocatori.size(); i++) {
                    S+=giocatori.get(i-1).get_all()+ System.getProperty("line.separator");
                }
                        return S;
        }
    Non mi sembra ci sia qualcosa che non vada.
    (Se siamo OT chiedo venia)
    Ultima modifica di MBdip; 10-06-2014 a 14:14

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    Scusate avevo segnato in rosso La riga 554… Comunque è questa:
    codice:
    switch(tabMain.getSelectedIndex()){
                         case 0:
                            // Aggiorno elenco Giocatori
      /*****554*****/       elenco = database.get_elenco_giocatori();
                            table = jTableGio;                       
                            break;

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    ok, ho compreso l'errore…
    Restituiva un NullPointerExceptionin quanto avevo inserito distruzione di creazione del database dopo initComponents();.
    Quel listner in particolare registra l'evento già al momento della chiamata initComponents(); quindi praticamente cercava qualcosa non ancora istanziato. È bastato inizializzare database prima di quella chiamata.

    Grazie a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.