>>>>> Hello,
>>>>>
[quoted text clipped - 162 lines]
>
> thanks for the help
Brandon:
I don't see anything there, nothing looks out of the ordinary. Any
chance that you've got a concurrency problem? Or maybe you are setting
the size of the ListModel before trying to remove the element?
I think this is going to be hard to find without a simpler test program.
I had a problem like that once though that I couldn't duplicate. I
ended up solving it by synchronizing access to the method where I
thought the problem was occurring. That was kind of a shotgun approach.
Sorry I can't be more help.

Signature
Knute Johnson
email s/nospam/knute/
Brandon McCombs - 05 Feb 2007 14:38 GMT
>>>>>> Hello,
>>>>>>
[quoted text clipped - 167 lines]
> chance that you've got a concurrency problem? Or maybe you are setting
> the size of the ListModel before trying to remove the element?
It's possible b/c like I said, I can't get it to work in Eclipse's
debugger and maybe the breakpoints I sort of straightening everything
out while being debugged. Well I don't specifically set it. To remove
the current items before I retrieve the most current children for the
selected tree node I call model.getListModel().removeAllElements(). Then
the search is executed and the newest data is put back into the list one
by one by looping through the Vector of results returned from the search.
> I think this is going to be hard to find without a simpler test program.
> I had a problem like that once though that I couldn't duplicate. I
> ended up solving it by synchronizing access to the method where I
> thought the problem was occurring. That was kind of a shotgun approach.
I've been setting synchronized keyword on some methods. I'll need to
keep doing that in case it helps but without a sure fire way of testing
this I may never really know if it's fixed.
> Sorry I can't be more help.
>>>>> Exception in thread "AWT-EventQueue-0"
>>>>> java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
[quoted text clipped - 6 lines]
> deletion by going through the ListModel for the JList which I thought
> was correct. I never knew you could create a read-only ListModel.
NB: a ListModel *is* read-only by default.
> The method I call for deleting a selected item from the JList is the
> following (model is the instance of BrowserModel):
>
> private void list_deleteObj() {
Is this method called from the EDT?
> The idx in the code above rarely matches (if ever) the index value
> listed in the generated exception and again, the deletion above still
> works when the exception is generated. Refresh() essentially determines
Sure, the exception originates from the UI-Delegate's paint method. Why
would you expect the deletion not to work?
The reason for the exception is usually a simple one: you're modifying
the underlying ListModel in one thread while the EDT repaints the list.
Imagine the following pseudo code as part of the painting procedure:
int n = model.getSize();
for ( int i = 0; i < n; i++ ) {
// ...
Object value = model.getElementAt(i);
// ...
}
Let's consider a ListModel that contains 5 elements. The code above runs
on the EDT, so it starts with n = 5 and enters the loop. Now, in another
thread you delete one element from the ListModel so that
model.getSize()==4. The loop continues until i=4, then an
ArrayIndexOutOfBoundsException will be thrown, e.g.: 4 >= 4. If the
second thread would have removed all elements from the ListModel, the
exception is thrown immediately at the next model.getElementAt method
call, e. g. 2 >= 0.
> The thread is spawned with this:
...
> asyncSearch = new AsyncSearch(this);
...
> asyncSearch.start();
Does AsynchSearch modify the ListModel? And if, how?
Bye
Michael
Brandon McCombs - 05 Feb 2007 14:33 GMT
>>>>>> Exception in thread "AWT-EventQueue-0"
>>>>>> java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
[quoted text clipped - 15 lines]
>
> Is this method called from the EDT?
currently it is not.
>> The idx in the code above rarely matches (if ever) the index value
>> listed in the generated exception and again, the deletion above still
>> works when the exception is generated. Refresh() essentially determines
>
> Sure, the exception originates from the UI-Delegate's paint method. Why
> would you expect the deletion not to work?
I never said I didn't expect it to work. I was notifying you guys that
it still was in case you didn't know and needed to know.
> The reason for the exception is usually a simple one: you're modifying
> the underlying ListModel in one thread while the EDT repaints the list.
[quoted text clipped - 16 lines]
> exception is thrown immediately at the next model.getElementAt method
> call, e. g. 2 >= 0.
ok that makes sense.
>> The thread is spawned with this:
>>
[quoted text clipped - 4 lines]
>
> Does AsynchSearch modify the ListModel? And if, how?
no. It calls updateGUI() from the component that spawned the thread.
Component is a constructor to that thread class and updateGUI() is an
interface method of an interface I created for that purpose of letting
the components (I got 3 of them) update themselves in their own ways.
Only one of them is involved with this problem though. I'll work on
making the delete method spawn from the EDT.
I don't suppose you guys know of a way I can test this to know for sure
it works?
> Bye
> Michael
Brandon McCombs - 06 Feb 2007 00:25 GMT
>>>>>> Exception in thread "AWT-EventQueue-0"
>>>>>> java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
[quoted text clipped - 43 lines]
> exception is thrown immediately at the next model.getElementAt method
> call, e. g. 2 >= 0.
Although what you say makes sense, I wonder if it's my problem because
I'm modifying the model outside of the EDT (whatever that situation is
properly termed) and after a few other method calls is when the model is
updated with new nodes. I don't know when the exception actually occurs
(painting when the item is deleted or painting when i refresh the list
to get the current contents from the server) so maybe your theory is
still accurate.
private void list_deleteObj() {
int idx = dirList.getSelectedIndex();
String dn = LDAPMgr.ldapUtility.getDN(
model.getListModel().getElementAt(idx) );
int ans = JOptionPane.showConfirmDialog(this,
"Confirm delete for:\n" + dn + "\n",
"Delete Object",
JOptionPane.YES_NO_OPTION,
JOptionPane.PLAIN_MESSAGE);
if (ans == 1)
return;
String msg = null;
msg = LDAPMgr.ldapUtility.deleteEntry(
model.getListModel().getElementAt(idx));
/* if successful */
if (msg == null) {
model.getListModel().remove(idx);
/* reload the subtree and list to show deletion */
refresh();
}
}
As you can see the removal from the list occurs before refresh(). In
refresh() I call expand(). In expand() I spawn the thread to refresh the
list model. If the repaint from the model.getListModel().remove(idx);
doesn't occur until my thread is spawned then maybe that creates the
exception. In another posting a few minutes before this one I tell
Nigel that I put the call to the method above on the EDT and it didn't
help; after enough deletions the exception crops up again.
Michael Rauscher - 06 Feb 2007 07:49 GMT
Brandon McCombs schrieb:
> Although what you say makes sense, I wonder if it's my problem because
> I'm modifying the model outside of the EDT (whatever that situation is
> properly termed) and after a few other method calls is when the model is
> updated with new nodes.
If you modfy the model outside of the EDT, then it's the problem. It's
easy. Really. Don't modify UI-state outside of the EDT and you don't get
strange Exceptions :)
I'll explain it in more detail, e. g. have a look at
> model.getListModel().remove(idx);
> /* reload the subtree and list to show deletion */
> refresh();
Since you're using DefaultListModel, the element at index idx gets
removed from DefaultListModel's data Vector. Then, the model's listeners
(to which the JList belongs, too) get notified. The JList repaints itself.
You call refresh afterwards. I expect, you set a new Vector on the
DefaultListModel. I expect that this occurs outside of the EDT, too.
Now, I can imagine two situations:
1) remove was called while repaint was active
2) refresh() modified the ListModel while repaint was active.
E. g. refresh could call DefaultListModel#removeAll.
> As you can see the removal from the list occurs before refresh().
Doesn't matter. The point is, that you modify UI-state outside of the
EDT. There are only a few methods in Swing (e. g. repaint()) that may be
used outside the EDT.
Bye
Michael
> The method I call for deleting a selected item from the JList is the
> following (model is the instance of BrowserModel):
[quoted text clipped - 19 lines]
> }
> }
What thread is the above method being executed on? If it's not the EDT you have
a problem there, you are modifying the JList in a thread other than the EDT.
The error is telling you that when the EDT came to draw a JList it tried to
access element 1 and that element didn't exist in the the DefaultListModel's
Vector at the time. That would imply a synchronization error, the Vector is in
the process of being modified whilst it's being drawn (the JList and
DefaultTreeModel have a different idea of how many elements there are), and I
don't see how that can happen unless it's being modified from another thread -
even the EDT can only do one thing at a time...

Signature
Nigel Wade, System Administrator, Space Plasma Physics Group,
University of Leicester, Leicester, LE1 7RH, UK
E-mail : nmw@ion.le.ac.uk
Phone : +44 (0)116 2523548, Fax : +44 (0)116 2523555
Brandon McCombs - 06 Feb 2007 00:19 GMT
>> The method I call for deleting a selected item from the JList is the
>> following (model is the instance of BrowserModel):
[quoted text clipped - 30 lines]
> don't see how that can happen unless it's being modified from another thread -
> even the EDT can only do one thing at a time...
Maybe I did this wrong but in the place in my code where I call the
method above I put the following:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
list_deleteObj(); }
});
And I still get the exception generated so what am I missing?
Michael Rauscher - 06 Feb 2007 07:53 GMT
Brandon McCombs schrieb:
>>> The method I call for deleting a selected item from the JList is the
>>> following (model is the instance of BrowserModel):
[quoted text clipped - 47 lines]
>
> And I still get the exception generated so what am I missing?
Look out for other threads. What does e. g. AsynchSearch do?
Bye
Michael
Brandon McCombs - 06 Feb 2007 15:03 GMT
> Brandon McCombs schrieb:
>>>
[quoted text clipped - 51 lines]
>
> Look out for other threads. What does e. g. AsynchSearch do?
It retrieves the current state of what the list should contain by
contacting an LDAP server. It then alerts the GUI the results are ready
by calling the GUI's updateGUI() method by I do that on the EDT like
above so it should be okay.
What I ended up doing that seems to work so far is I put the body of the
method prepareGUI() inside of the SwingUtilities.invokeLater() call.
The prepareGUI() is called by asyncSearch to prepare the GUI before the
newest results are loaded. prepareGUI() is actually what deletes the
rest of the items in the listmodel so that I don't get duplicate entries
when it is updated. I've been testing that and haven't received the
exception, yet.
Michael Rauscher - 06 Feb 2007 22:29 GMT
>>> And I still get the exception generated so what am I missing?
>>
[quoted text clipped - 12 lines]
> when it is updated. I've been testing that and haven't received the
> exception, yet.
Sounds good. Next time don't follow the trial and error method: just
ensure that any code that modifies the GUI runs on the EDT.
Bye
Michael