import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.ListDataListener;
class NewEntryComboBoxModel implements MutableComboBoxModel
{
public static String NEW_ENTRY_ELEMENT = "New entry...";
private MutableComboBoxModel delegate;
private boolean newEntryElementSelected = false;
public NewEntryComboBoxModel(MutableComboBoxModel delegate)
{
this.delegate = delegate;
}
public void addListDataListener(ListDataListener l)
{
delegate.addListDataListener(l);
}
public Object getElementAt(int index)
{
if (index == delegate.getSize())
{
return NEW_ENTRY_ELEMENT;
}
return delegate.getElementAt(index);
}
public void setSelectedItem(Object anItem)
{
if (NEW_ENTRY_ELEMENT.equals(anItem))
{
newEntryElementSelected = true;
}
else
{
newEntryElementSelected = false;
delegate.setSelectedItem(anItem);
}
}
public Object getSelectedItem()
{
if (newEntryElementSelected)
{
return NEW_ENTRY_ELEMENT;
}
return delegate.getSelectedItem();
}
public int getSize()
{
return delegate.getSize()+1;
}
public void removeListDataListener(ListDataListener l)
{
delegate.removeListDataListener(l);
}
@Override
public void addElement(Object obj)
{
delegate.addElement(obj);
}
@Override
public void insertElementAt(Object obj, int index)
{
delegate.insertElementAt(obj, index);
}
@Override
public void removeElement(Object obj)
{
delegate.removeElement(obj);
}
@Override
public void removeElementAt(int index)
{
delegate.removeElementAt(index);
}
}
public class ComboBoxModelWithAddTest extends JPanel implements ActionListener
{
public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
private MutableComboBoxModel model = new NewEntryComboBoxModel(new DefaultComboBoxModel());
public ComboBoxModelWithAddTest()
{
super(new BorderLayout());
String[] items = { "First", "Second", "Third" };
for (String item : items)
{
model.addElement(item);
}
JComboBox cb = new JComboBox(model);
cb.setSelectedIndex(0);
cb.addActionListener(this);
add(cb, BorderLayout.PAGE_START);
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
}
public void actionPerformed(ActionEvent e)
{
JComboBox cb = (JComboBox) e.getSource();
String item = (String) cb.getSelectedItem();
System.out.println("Selected: " + item);
if (item.equals(NewEntryComboBoxModel.NEW_ENTRY_ELEMENT))
{
System.out.println("Adding new entry");
String s = "Element "+String.valueOf(System.currentTimeMillis());
model.addElement(s);
model.setSelectedItem(s);
}
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("ComboBoxDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new ComboBoxModelWithAddTest();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.setSize(300,200);
frame.setVisible(true);
}
}