Anyone happen to see what I might be doing wrong. I'm trying to add
items to my
JComboBox on the fly as nodes are added to the tree. It's like this ...
1. User adds tree nodes to a tree.
2. Then user can select on another node elsewhere in the tree which
renders a JComboBox
and the items just added from step 1 are listed in this box.
I have a few problems ...
- after I select my item in the combobox, the combobox stays there. If
I then select on another node, the item in the combobox doesn't get
selected. It doesn't work where I just select an item and it closes up
and that item is selected.
- sometimes I get a null pointer exception in action performed (because
getSelectedIndex() in getCellEditorValue() returns a -1) which seems to
get called while the program execution is still in the
getTreeCellEditorComponent. This confuses me. Why's it returning -1
when there are items in my combobox?
Any help much appreciated.
(I hope I've got my code snippet here w/o any typos, I had to cut it
down)
----
public class TreeEditor extends AbstractCellEditor implements
TreeCellEditor
{
private JComboBox myComboBox;
public TreeEditor() {
myComboBox = new JComboBox();
myComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
TreePath path = jTree.getSelectionPath();
stopCellEditing();
Integer val = (Integer) getCellEditorValue();
myComboBox.setSelectedItem(val.intValue());
((MyUserObjectInfo)nodeInfo).setName(
myComboBox.getSelectedItem().toString());
node.setUserObject(((MyUserObjectInfo) nodeInfo));
jTree.getModel().valueForPathChanged(path, nodeInfo);
}
});
}
public Object getCellEditorValue() {
return new Integer(myComboBox.getSelectedIndex());
}
public Component getTreeCellEditorComponent(JTree tree,
Object value, boolean isSelected, boolean expanded,
boolean leaf, int row) {
// find the children of this node that were recently added ...
TreeModel tModel = jTree.getModel();
Object root = tModel.getRoot();
DefaultMutableTreeNode carRoot = (DefaultMutableTreeNode)
tModel.getChild(root, 0);
String nodeName = null;
if (myComboBox.getItemCount() > 0) {
myComboBox.removeAllItems();
}
// add children of another node into this combobox.
for (Enumeration e = carRoot.children(); e.hasMoreElements();)
{
DefaultMutableTreeNode carNode =
(DefaultMutableTreeNode)e.nextElement();
Object nodeInfo = carNode.getUserObject();
nodeName = ((MyUserObjectInfo)nodeInfo).getName();
myComboBox.addItem(nodeName);
}
if (myComboBox.getItemCount() > 0) {
myComboBox.setSelectedIndex(0);
}
return myComboBox;
}
}
Martin Bradley - 26 Nov 2005 18:05 GMT
> Anyone happen to see what I might be doing wrong. I'm trying to add
> items to my
[quoted text clipped - 93 lines]
> }
>
William,
Should your ComboBoxModel not be listening to the table model such that
it gets informed of new items added to the table model? That are they
are independent classes.
Anyway I'll tell you about my problems with JComboBox as well. I was
trying to modify the contents of the list in two ways
1) If the user selected the item then that item should be removed.
2) If an external component decided to add/remove an item from the
DefaultComboBox model then it should be ok.
The problems I had were (I think) that I decided to use the
ActionListener interface to see whenever the user selected an item, I
should have used ItemListener.
The other problem I notices was that whenever the DefaultComboModel
removed the currently selected item it fires an actionEvent. This
caused a chain reaction whenever I selected an item in the box.
1. Select item in the combo box with a mouse.
2. ActionPerformed method removes the newly selected item
3. Step 2 causes the DefaultComboBoxModel to fireActionEvent this
causes actionPerformed to be fired.....
cheers,
Marty.