Re: How to update JComboBox without Selected Item being changed
J=FCrgen Gerstacker wrote:
Hello,
I want to periodically update a Combobox due to changes in the OS
(available RS232 serial ports).
I started to fill the box every time the combobox becomes visible
setup_cbport.removeAllItems();
while () {
...
setup_cbport.addItem(portId.getName());
...
}
setup_cbport.setSelectedItem(port); // previously selected item
But when the box is being filled, an actionPerformed is fired
public void actionPerformed(ActionEvent e) {
if (e.getSource()==setup_cbport) {
Object obj=setup_cbport.getSelectedItem();
port=(String)obj; // new selection
}
and the previous selected item is overwritten.
I could compare the items in the box with the new items and
'add'/'remove' individually but this would complicated the code. I
would like a simple solution, e.g. to allow the new selection only when
the user changes the ComboBox, not when the 'actionPerformed' is issued
by the System.
Any ideas?
Jurgen,
The problem you have is that you want fairly complex functionality from
your combo box but you are using the simple, convinience methods to
manage it. Obviously this isn't going to work.
The reason you are seeing the actionPerformed event is most likley
because your combo box is informed of the model change after you call
'removeAllItems'. This is causing the selected item to change (because
you have removed it). The combo box default model cannot 'know' that
you intend to add the item back again a few lines later.
What you need to do to solve this issue is write your own
ComboBoxModel. This will give you complete control over the items in
the combo box as well as complete control over when the combo box will
attempt to re-evaluate its data based on the new model.
The interface you should implement is
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/ComboBoxModel.html
Implementing this should not be hard (its only a few methods) but you
must remember to keep track of your 'ListDataListeners' (which are
provided to you when addListDataListener is called) and when you update
the contents of your model with the new information, fire an
appropriate event to all of your ListDataListeners. It is when this
event is fired, that the combo box will re-evaluate the model. It will
call 'getSelectedItem' and provided the item is equal (.equals) to the
previous item, it should not change the selected item and therefore not
fire actionPerformed. You will, of course, have to formulate a strategy
for what happens when the selected item IS removed, but you would have
had to do that anyway, and using a custom model will give you much more
control over the behaviour.
Good Luck!