Domanda

Ho un componente JList che dovrebbe essere svuotato e ripopolata. Il seguente codice (in base alla mia codice originale) mostra un semplice finestra con un JList e un JButton:

import java.awt.BorderLayout;
import javax.swing.*;

public class JListTest extends javax.swing.JFrame{
    JList jList;
    JButton button;
    DefaultListModel model;

    public JListTest() {
        jList = new JList();
        model = new DefaultListModel();
        jList.setModel( model );
        button = new JButton();

        getContentPane().add(jList, java.awt.BorderLayout.CENTER);

        button.setText("add 10000 items");
        button.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                model.clear();
                for( int i=0; i<10000; ++i ) {
                    model.addElement( "aaaa");
                }
            }
        });
        getContentPane().add(button, BorderLayout.PAGE_START);        
        pack();        
    }

    public static void main(String args[]) {
        JListTest jlt =new JListTest();
        jlt.setSize(300, 300);
        jlt.setVisible( true );
    }
}

Se si preme il pulsante di inserimento (10000 articoli) è molto veloce. Se premo di nuovo e di nuovo è ancora molto veloce.

Se si seleziona la terza voce e premere il pulsante, il risultato è lo stesso, l'inserimento è molto veloce.

Se si seleziona la prima voce e premere il pulsante, il programma diventa molto lento (in realtà devo fermarlo).

Perché la selezione delle prime rallenta voce verso il basso l'esecuzione?

Ho provato usando JDK 1.5 e 1.6.

È stato utile?

Soluzione

Io suggerirei di scrivere il proprio modello che permette di aggiungere un po 'di valori in una sola volta. Credo che non è l'aggiunta al modello ma le cose GUI innescato da questo che uccidono le prestazioni.

Altri suggerimenti

Non sono sicuro perché la selezione di un oggetto fa sì che il problema di prestazioni. Ma ogni volta che si aggiunge un elemento di un evento viene generato che racconta la lista di ridipingere itslef. Così forse il fatto che un elemento è selezionato cause riverniciatura supplementare.

In ogni caso un modo migliore per farlo sarebbe quello di creare un nuovo modello e poi basta aggiungerlo alla lista:

    button.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            DefaultListModel dlm = new DefaultListModel();
            for( int i=0; i<10000; ++i ) {
                dlm.addElement( "aaaa");
            }
            jList.setModel(dlm);
        }
    });

Questa eventi modo non vengono sparati come viene aggiunta ogni nuovo elemento.

non dovrebbe essere l'aggiunta di un sacco di elementi nel modello in un ciclo caso del genere. Molto meglio sarebbe quello di avere la vostra azione ascoltatore deporre le uova fuori un filo per aggiungere gli elementi, e hanno quel filo invocare uno SwingUtilities.invokeLater () per generare l'evento modifica alla lista.

Si noti che come per il commento qui sotto, è necessario effettuare un AbstractListModel (o una sottoclasse di esso) e rendere il modello, e la chiamata fireContentsChanged su di essa nel invokeLater.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top