Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di smithi
    Registrato dal
    Jun 2010
    Messaggi
    17

    [java] ListCellRenderer chiamato di continuo

    Ciao a tutti,
    ho scritto il seguente codice per visualizzare un JSpinner per ogni elemento di una JList.

    codice:
    JList listSpinner = new JList(buildSpinnerItems(listData.length));
    listSpinner.setCellRenderer(new SpinnerRenderer());
    
    class SpinnerRenderer extends JSpinner implements ListCellRenderer {
    
    
    		@Override
    		public Component getListCellRendererComponent(JList list, Object value,int index, boolean isSelected, boolean cellHasFocus) {
    	
    				System.out.println(getValue());
    				return this;
    			
    		}
    	}
    }
    Il problema è che il metodo getListCellRendererComponent viene eseguito di continuo e la println mi stampa una serie infinita di valori.
    Cosa sbaglio?
    Grazie per l'aiuto!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Cosa vuol dire "viene richiamato di continuo"? Quel metodo viene richiamato ogni volta che è necessario ridisegnare la cella della JList...

    Non capisco cosa ci sia di sbagliato... cosa ti aspetti che faccia?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di smithi
    Registrato dal
    Jun 2010
    Messaggi
    17
    Mi aspetto che una volta che la JList è disegnata, il metodo non venga più richiamato fino a quando non succede qualcosa per cui è necessario ridisegnare la JList...o no?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Ed infatti così è.
    Ho fatto una prova, prendendo pari pari la tua classe del renderer e usandola in questa:

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class MioFrame extends JFrame {
    
       private JList listSpinner;
    
       public MioFrame() {
    
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          listSpinner = new JList( creaValori() );
          listSpinner.setCellRenderer(new SpinnerRenderer());  
          JScrollPane jsp = new JScrollPane( listSpinner );
    
          c.add(jsp, BorderLayout.CENTER);
    
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setSize(800, 600);
          setTitle("Prova Spinner");
          setLocationRelativeTo( null );
          setVisible( true );
       }
    
       private Integer[] creaValori() {
          return new Integer[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
       }
    
       public static void main(String[] args) {
          MioFrame mf = new MioFrame();
       }
    }
    In console vedo stampati tutti i valori (in realtà, una sfilza di zeri perchè lo spinner non viene mai valorizzato) per sole 2 volte (evidentemente, vengono stampate al momento della creazione con la finestra non visibile e una seconda quando la finestra diventa visibile).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di smithi
    Registrato dal
    Jun 2010
    Messaggi
    17
    Il mio problema è proprio questo, a me stampa una sfilza infinita di zeri e la continua a stampare fino a quando non chiudo tutto.
    Ora provo con il tuo esempio.
    Grazie

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Originariamente inviato da smithi
    Il mio problema è proprio questo, a me stampa una sfilza infinita di zeri e la continua a stampare fino a quando non chiudo tutto.
    Ora provo con il tuo esempio.
    Grazie
    Sul perchè stampa una sfilza di zeri la risposta è semplice: stai stampando il valore restituito da "getValue()" di JSpinner... ma non hai mai valorizzato lo spinner... ovvero, SpinnerRendere è uno JSpinner (extends), ma non ha alcun costruttore (quindi richiama implicitamente un super() al costruttore di default di JSpinner), né tu effettui alcun setValue() dentro al metodo getListCellRendererComponent()... di conseguenza, ottieni il valore pre-impostato di default per JSpinner: zero.

    Sul motivo che porta a continuare a stampare a video, non ti so dire nulla perchè bisogna vedere il contesto in cui viene fatta la creazione/visualizzazione del JList... ci deve essere qualcos'altro che non va a quel livello nel tuo codice.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di smithi
    Registrato dal
    Jun 2010
    Messaggi
    17
    Risolto l'arcano

    La mia classe è un JScrollPane e al suo interno costruisco tre JList: una di JCheckBox, una nomale e una di JSpinner.
    Il comportamento anomalo era causato da questa istruzione:

    codice:
    setRowHeaderView(listCheckBox);

    Aggiungendo la listCheckBox nel JPanel insieme alle altre liste tutto si è risolto.
    codice:
    JPanel panel = new JPanel(new BorderLayout());
    panel.add(listCheckBox, BorderLayout.LINE_START);
    panel.add(listDescription, BorderLayout.CENTER);
    panel.add(listSpinner, BorderLayout.LINE_END);
    setViewportView(panel);

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.