import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 

public class GrowingShrinkingList { 
   
    JFrame frame;
    DefaultListModel model;

    public GrowingShrinkingList() {
      model = new DefaultListModel();
      frame = new JFrame();
      JList list = new JList(model);
      JScrollPane  scrollpane = new JScrollPane(list);
      JPanel p = new JPanel();
      p.add(scrollpane);
      frame.getContentPane().add(p, "Center"); 
      JButton b = new JButton("Fill List"); 
      p = new JPanel(); 
      p.add(b); 
      frame.getContentPane().add(p, "North"); 
      b.addActionListener(new ActionListener() { 
         public void actionPerformed(ActionEvent event) { 
           WorkingThread t = new WorkingThread(); t.start(); }
      });
    }

    public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
        public void run() {
          createAndShowGUI();
        }
      });
    }

    public static void createAndShowGUI() {
      GrowingShrinkingList gsl = new GrowingShrinkingList(); 
      gsl.frame.pack();
      gsl.frame.setVisible(true);
    } 

    class WorkingThread extends Thread {
      public void run() {
        Random generator = new Random();
        while (true) { 
          Integer i = new Integer(generator.nextInt(10)); 
          if (model.contains(i))  {
            EventQueue.invokeLater(new ElementRemover(model,i));
          } else {
            SwingUtilities.invokeLater(new ElementAdder(model,i));
          }
          Thread.yield();
        } 
      }
   }
  
   class ElementRemover implements Runnable { 
     int index;
     DefaultListModel model;
     public ElementRemover(DefaultListModel m, int i) {
       index = i;
       model = m;
     }
     public void run() {
       model.removeElement(index); 
     }
   }
  
   class ElementAdder implements Runnable { 
     int index;
     DefaultListModel model;
     public ElementAdder(DefaultListModel m, int i) {
       index = i;
       model = m;
     }
     public void run() {
       model.addElement(index); 
     }
   }
} 
