B
Brandon McCombs
I have a tabbed pane with 3 tabs. 2 of the tabs can start a thread that
performs a search and the results of the search get put into the
respective data models that are in the tabs. I created 1 class that
extends Thread that is used across both tabs. The tabs are searching
the same repository, just with different criteria so it's possible that
the search operation for 1 tab will finish before the other.
I've discovered that when the search from tab 1 finishes then *some* of
the results from tab 3 get put into the data model for tab 1. First, I
don't even know why only some of the results would be listed in tab 1
but the bigger issue is that the results from tab 3's search operation
shouldn't be showing up at all in tab 1 because it spawned its own
search operation with a new thread instance.
A while back I created a single JPanel class that contains all the
widgets for a particular tab to separate the tab GUI code. Each one of
those JPanel classes implements an interface I created a couple days ago
and the interface methods are called by the AsyncSearch thread to pass
back the results. The constructor you see below takes an
AsyncSearchInterface object as the argument which all the JPanel classes
implement as I state above.
This is how I setup a search operation in my Search Jpanel class. I do
this everytime so a new thread is created for every search.
AsyncSearch asyncSearch = new AsyncSearch(this);
asyncSearch.setSearchBase(searchBase);
asyncSearch.setFilter(searchFilter);
asyncSearch.setTimeLimit(timeLimit);
asyncSearch.setResultLimit(resLimit);
asyncSearch.setReturnedAttributes(objAttribs);
asyncSearch.setScope(searchScope);
asyncSearch.start();
To tell a tab that its results are ready to be processed I do the
following in the run() of the thread, after the search() actually
executes of course (component is the JPanel instance that implements
AsyncSearchInterface):
final String thread = getName();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
component.updateGUI(results, thread);
component.resetGUI(results);
}
});
I can tell that when 2 threads are spawned that they both terminate
although they do it at the same time. The search from tab 1 determines
when the one from tab 3 terminates but the data displayed in tab 1 is
the data from tab 3's search. I'm not doing any join() or anything fancy
like that so I don't see how the threads seem to be becoming one. The
results variable in the thread is not a static variable either.
Can anyone explain why this is happening? Do I need to make another
class that uses a thread so each tab has its own thread class? I hate to
do that since I was trying to save code by making a generic search
thread that all tabs could utilize.
thanks
Brandon
performs a search and the results of the search get put into the
respective data models that are in the tabs. I created 1 class that
extends Thread that is used across both tabs. The tabs are searching
the same repository, just with different criteria so it's possible that
the search operation for 1 tab will finish before the other.
I've discovered that when the search from tab 1 finishes then *some* of
the results from tab 3 get put into the data model for tab 1. First, I
don't even know why only some of the results would be listed in tab 1
but the bigger issue is that the results from tab 3's search operation
shouldn't be showing up at all in tab 1 because it spawned its own
search operation with a new thread instance.
A while back I created a single JPanel class that contains all the
widgets for a particular tab to separate the tab GUI code. Each one of
those JPanel classes implements an interface I created a couple days ago
and the interface methods are called by the AsyncSearch thread to pass
back the results. The constructor you see below takes an
AsyncSearchInterface object as the argument which all the JPanel classes
implement as I state above.
This is how I setup a search operation in my Search Jpanel class. I do
this everytime so a new thread is created for every search.
AsyncSearch asyncSearch = new AsyncSearch(this);
asyncSearch.setSearchBase(searchBase);
asyncSearch.setFilter(searchFilter);
asyncSearch.setTimeLimit(timeLimit);
asyncSearch.setResultLimit(resLimit);
asyncSearch.setReturnedAttributes(objAttribs);
asyncSearch.setScope(searchScope);
asyncSearch.start();
To tell a tab that its results are ready to be processed I do the
following in the run() of the thread, after the search() actually
executes of course (component is the JPanel instance that implements
AsyncSearchInterface):
final String thread = getName();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
component.updateGUI(results, thread);
component.resetGUI(results);
}
});
I can tell that when 2 threads are spawned that they both terminate
although they do it at the same time. The search from tab 1 determines
when the one from tab 3 terminates but the data displayed in tab 1 is
the data from tab 3's search. I'm not doing any join() or anything fancy
like that so I don't see how the threads seem to be becoming one. The
results variable in the thread is not a static variable either.
Can anyone explain why this is happening? Do I need to make another
class that uses a thread so each tab has its own thread class? I hate to
do that since I was trying to save code by making a generic search
thread that all tabs could utilize.
thanks
Brandon