Java/Swing Components/Dual List
Dual Lists Demo
<source lang="java">
import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.SortedSet; import java.util.TreeSet; import javax.swing.AbstractListModel; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.ListModel; public class MainClass {
public static void main(String args[]) { JFrame frame = new JFrame("Dual List Box Tester"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DualListBox dual = new DualListBox(); dual.addSourceElements(new String[] { "One", "Two", "Three" }); frame.add(dual, BorderLayout.CENTER); frame.setSize(400, 300); frame.setVisible(true); }
} class DualListBox extends JPanel {
private static final Insets EMPTY_INSETS = new Insets(0, 0, 0, 0); private static final String ADD_BUTTON_LABEL = "Add >>"; private static final String REMOVE_BUTTON_LABEL = "<< Remove"; private static final String DEFAULT_SOURCE_CHOICE_LABEL = "Available Choices"; private static final String DEFAULT_DEST_CHOICE_LABEL = "Your Choices"; private JLabel sourceLabel; private JList sourceList; private SortedListModel sourceListModel; private JList destList; private SortedListModel destListModel; private JLabel destLabel; private JButton addButton; private JButton removeButton; public DualListBox() { initScreen(); } public String getSourceChoicesTitle() { return sourceLabel.getText(); } public void setSourceChoicesTitle(String newValue) { sourceLabel.setText(newValue); } public String getDestinationChoicesTitle() { return destLabel.getText(); } public void setDestinationChoicesTitle(String newValue) { destLabel.setText(newValue); } public void clearSourceListModel() { sourceListModel.clear(); } public void clearDestinationListModel() { destListModel.clear(); } public void addSourceElements(ListModel newValue) { fillListModel(sourceListModel, newValue); } public void setSourceElements(ListModel newValue) { clearSourceListModel(); addSourceElements(newValue); } public void addDestinationElements(ListModel newValue) { fillListModel(destListModel, newValue); } private void fillListModel(SortedListModel model, ListModel newValues) { int size = newValues.getSize(); for (int i = 0; i < size; i++) { model.add(newValues.getElementAt(i)); } } public void addSourceElements(Object newValue[]) { fillListModel(sourceListModel, newValue); } public void setSourceElements(Object newValue[]) { clearSourceListModel(); addSourceElements(newValue); } public void addDestinationElements(Object newValue[]) { fillListModel(destListModel, newValue); } private void fillListModel(SortedListModel model, Object newValues[]) { model.addAll(newValues); } public Iterator sourceIterator() { return sourceListModel.iterator(); } public Iterator destinationIterator() { return destListModel.iterator(); } public void setSourceCellRenderer(ListCellRenderer newValue) { sourceList.setCellRenderer(newValue); } public ListCellRenderer getSourceCellRenderer() { return sourceList.getCellRenderer(); } public void setDestinationCellRenderer(ListCellRenderer newValue) { destList.setCellRenderer(newValue); } public ListCellRenderer getDestinationCellRenderer() { return destList.getCellRenderer(); } public void setVisibleRowCount(int newValue) { sourceList.setVisibleRowCount(newValue); destList.setVisibleRowCount(newValue); } public int getVisibleRowCount() { return sourceList.getVisibleRowCount(); } public void setSelectionBackground(Color newValue) { sourceList.setSelectionBackground(newValue); destList.setSelectionBackground(newValue); } public Color getSelectionBackground() { return sourceList.getSelectionBackground(); } public void setSelectionForeground(Color newValue) { sourceList.setSelectionForeground(newValue); destList.setSelectionForeground(newValue); } public Color getSelectionForeground() { return sourceList.getSelectionForeground(); } private void clearSourceSelected() { Object selected[] = sourceList.getSelectedValues(); for (int i = selected.length - 1; i >= 0; --i) { sourceListModel.removeElement(selected[i]); } sourceList.getSelectionModel().clearSelection(); } private void clearDestinationSelected() { Object selected[] = destList.getSelectedValues(); for (int i = selected.length - 1; i >= 0; --i) { destListModel.removeElement(selected[i]); } destList.getSelectionModel().clearSelection(); } private void initScreen() { setBorder(BorderFactory.createEtchedBorder()); setLayout(new GridBagLayout()); sourceLabel = new JLabel(DEFAULT_SOURCE_CHOICE_LABEL); sourceListModel = new SortedListModel(); sourceList = new JList(sourceListModel); add(sourceLabel, new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, EMPTY_INSETS, 0, 0)); add(new JScrollPane(sourceList), new GridBagConstraints(0, 1, 1, 5, .5, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, EMPTY_INSETS, 0, 0)); addButton = new JButton(ADD_BUTTON_LABEL); add(addButton, new GridBagConstraints(1, 2, 1, 2, 0, .25, GridBagConstraints.CENTER, GridBagConstraints.NONE, EMPTY_INSETS, 0, 0)); addButton.addActionListener(new AddListener()); removeButton = new JButton(REMOVE_BUTTON_LABEL); add(removeButton, new GridBagConstraints(1, 4, 1, 2, 0, .25, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 5, 0, 5), 0, 0)); removeButton.addActionListener(new RemoveListener()); destLabel = new JLabel(DEFAULT_DEST_CHOICE_LABEL); destListModel = new SortedListModel(); destList = new JList(destListModel); add(destLabel, new GridBagConstraints(2, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, EMPTY_INSETS, 0, 0)); add(new JScrollPane(destList), new GridBagConstraints(2, 1, 1, 5, .5, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, EMPTY_INSETS, 0, 0)); } private class AddListener implements ActionListener { public void actionPerformed(ActionEvent e) { Object selected[] = sourceList.getSelectedValues(); addDestinationElements(selected); clearSourceSelected(); } } private class RemoveListener implements ActionListener { public void actionPerformed(ActionEvent e) { Object selected[] = destList.getSelectedValues(); addSourceElements(selected); clearDestinationSelected(); } }
} class SortedListModel extends AbstractListModel {
SortedSet<Object> model; public SortedListModel() { model = new TreeSet<Object>(); } public int getSize() { return model.size(); } public Object getElementAt(int index) { return model.toArray()[index]; } public void add(Object element) { if (model.add(element)) { fireContentsChanged(this, 0, getSize()); } } public void addAll(Object elements[]) { Collection<Object> c = Arrays.asList(elements); model.addAll(c); fireContentsChanged(this, 0, getSize()); } public void clear() { model.clear(); fireContentsChanged(this, 0, getSize()); } public boolean contains(Object element) { return model.contains(element); } public Object firstElement() { return model.first(); } public Iterator iterator() { return model.iterator(); } public Object lastElement() { return model.last(); } public boolean removeElement(Object element) { boolean removed = model.remove(element); if (removed) { fireContentsChanged(this, 0, getSize()); } return removed; }
}
</source>