package no.ntnu.fp.gui; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JViewport; import javax.swing.ListCellRenderer; import javax.swing.ListModel; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; public class JEditableList extends JPanel implements ListDataListener { private ListCellRenderer listCellRenderer; private ListModel dataModel; public JEditableList(ListModel model, ListCellRenderer listCellRenderer) { setLayout(null); setCellRenderer(listCellRenderer); setListModel(model); } private void setListModel(ListModel model) { if (model != null) { if (dataModel != null) { dataModel.removeListDataListener(this); } dataModel = model; dataModel.addListDataListener(this); update(); } } public void update() { if (dataModel != null) { removeAll(); int n = dataModel.getSize(); int y = 0; for (int i=0; i<n; i++) { Component comp = listCellRenderer.getListCellRendererComponent(null, null, i, false, false); Dimension size = comp.getPreferredSize(); int width = size.width; int height = size.height; comp.setBounds(0, y, width, height); comp.repaint(); y += height; add(comp); } setPreferredSize(new Dimension(280, y)); if (getParent() != null) { Container c = getParent(); if (c instanceof JComponent) { JComponent comp = (JComponent)c; comp.revalidate(); comp.repaint(); } } } } public void setCellRenderer(ListCellRenderer listCellRenderer) { this.listCellRenderer = listCellRenderer; } @Override public void intervalAdded(ListDataEvent e) { update(); } @Override public void intervalRemoved(ListDataEvent e) { update(); } @Override public void contentsChanged(ListDataEvent e) { update(); } }