package lettergame.model; import java.awt.BorderLayout; import java.awt.Color; import java.util.*; import javax.swing.*; import javax.swing.border.LineBorder; public class ListView extends Box implements Observer{ ObservableList model; ComponentFactory factory; WeakHashMap views = new WeakHashMap(); public ListView(ObservableList model, ComponentFactory factory) { super(BoxLayout.Y_AXIS); this.model = model; this.factory = factory; updateView(); model.addObserver(this); } void updateView() { removeAll(); for (T listItem : model) add(getViewFor(listItem)); revalidate(); repaint(); } JComponent getViewFor(T listItem) { if (!views.containsKey(listItem)) views.put(listItem, factory.createView(listItem)); return views.get(listItem); } public void update(Observable arg0, Object arg1) { updateView(); } // Test program public static void main(String[] args) { ObservableList model = new ObservableList(new LinkedList()); ListView listView = new ListView(model, new ComponentFactory() { public JComponent createView(String item) { return new JLabel(item); } }); new TestFrame(listView); rest(1000); model.add("hello"); rest(1000); model.add("there"); rest(1000); model.add("world"); for (char x = 'a'; (int) x <= (int) 'z'; x++) { model.add(""+x); } rest(1000); model.move(0,15); model.move(28,27); rest(5000); model.move(27,28); } static void rest(int ms) { try { Thread.sleep(ms); } catch (InterruptedException ie) { ie.printStackTrace(); } } }