2009-05-03 6 views
5

Sto cercando di cambiare un JList all'interno di un JScrollPane in modo dinamico, utilizzandoFai JScrollPane barre di scorrimento di visualizzazione quando JList interno è cambiato

myList.setListData(someArray); 

Dopo questo mi aspetterei il JScrollPane per mostrare barre di scorrimento, se necessario, ma questo doesn' t succedere Googling il problema non è stato molto utile. Ho provato varie combinazioni dei seguenti metodi, con scarso successo (in pratica frugando attraverso la documentazione API):

myScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
myList.validate(); myScrollPane.validate(); 
myScrollPane.setPreferredSize(Dimension someDimension); 
myScrollPane.setViewportView(moduleList); 
myScrollPane.setLayout(...); 

Quando si utilizza il primo metodo appare una barra di scorrimento, ma non viene attivato dal cambio di modello. Mi sono anche collegato a PropertyChangeEvent e ho convalidato che JList si attiva e si verifica quando il modello è cambiato. Cosa mi manca qui? Che metodo devo usare per fare questo lavoro, o meglio ancora quale proprietà renderebbe questo lavoro fuori dalla scatola?

+1

Non sicuro che ciò possa essere d'aiuto, ma assicurarsi che la chiamata a setListData (...) si verifichi sul thread di eventi. Ogni sorta di cose brutte può accadere se si muta un oggetto UI su un thread diverso. Inoltre, hai guardato JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED? Non è esattamente chiaro cosa intendi per "attivato dal cambio di modello". –

risposta

9

se il PreferredSize è impostato su JList, anche se (0, 0), allora JScrollPane non funziona - garantire che non è impostata, setPreferredSize (null) se necessario

vedi mrtextminer come segue

La soluzione a questo problema è di non impostare il preferito di JList (rimuovendo l'istruzione di impostazione). In Netbeans IDE 5.5.1, è possibile annullare il preferredSize di JList facendo clic con il pulsante destro del mouse sulla proprietà preferredSize di JList e selezionando "ripristina valore predefinito".

In conclusione, impostare preferredSize solo su JScrollPane.Non impostare preferredSize di JList.

+0

In realtà ho corretto un errore di vecchia data in una delle mie applicazioni. Grazie. :) – Bombe

3

ha appena scritto una piccola app di esempio per testare questo comportamento e funziona immediatamente. quando si modificano i dati dell'elenco, le barre di scorrimento verticali e orizzontali vengono aggiunte allo schermo di scorrimento in base alle esigenze per impostazione predefinita.

public class Frametest { 

private JList list; 

public Frametest() { 
    JFrame f = new JFrame("Scrollable JList"); 
    f.setSize(200, 300); 
    JScrollPane jsp = new JScrollPane();   
    list = new JList(); 
    jsp.getViewport().add(list); 
    f.getContentPane().setLayout(new BorderLayout()); 
    f.getContentPane().add(jsp, BorderLayout.CENTER); 
    JButton button = new JButton("update"); 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      Object[] objects = new Object[20]; 
      for(int i=0; i<20; i++) { 
       objects[i] = "foo foo foo foo foo foo foo foo foo foo foo foo "+i; 
      } 
      list.setListData(objects); 
     } 
    }); 
    f.getContentPane().add(button, BorderLayout.SOUTH); 
    f.setVisible(true);  
} 

public static void main(String[] args) { 
    new Frametest(); 
}} 
+0

Sospetto che potrebbe aggiungere i dati DOPO che la lista è stata resa visibile dal momento che sta parlando del cambio di modello ... – willcodejavaforfood

+0

Sì, funziona nell'esempio! Quando si preme il pulsante di aggiornamento (la lista è già stata resa visibile), il modello viene modificato e le barre di scorrimento vengono regolate. –

+0

Sì, sto praticamente facendo esattamente quello che hai fatto, ma il tuo codice funziona per me - darò un'occhiata più da vicino a quello che NON sto facendo ... Sospetto che potrebbe essere qualcosa con il layout - grazie! – VolkA

2

Hai provato chiamando il metodo validate o revalidate del JList sul fare modifiche ai dati della lista?

myList.setListData(someArray); 
myList.revalidate(); 

Per vostra informazione, ho appena fatto una rapida ricerca della differenza tra validate e revalidate e sembra essere il fatto che validate sarà il layout per la componente del metodo è stato chiamato sul e dei suoi figli, mentre revalidate sarà andare fino al suo genitore più alto e quindi eseguire le modifiche al layout e così a tutti i suoi figli.

La chiamata di revalidate su myList non solo convalida l'elenco stesso, ma convalida anche il riquadro di scorrimento, pertanto, influendo sulla visibilità della barra di scorrimento a seconda degli elementi disegnati nell'elenco.

+0

Sì, ho provato entrambi, ma senza alcun effetto ... – VolkA

1

Questo sembra sbagliato:

jsp.getViewport().add(list); 

usare al posto: saranno aggiunti correttamente

jsp.setViewportView(list); 

o

new JScrollPane(list); 

e l'elenco alla ScrollPane. Aggiungendolo in questo modo dice allo scrollpan di ascoltarlo per le modifiche.

1

se hai ancora bisogno di questo provare a rimuovere i metodi convalida e se si dispone di un setpreferredsize sulla lista rimuoverlo, fu così che il mio preso incasinato

ho rimosso

resultList.setPreferredSize(resultList.getPreferredSize()); 

ed è done

Problemi correlati