Hi, ich habe jetzt noch ein letztes Problem.
Ich habe eigentlich alle wichtigen Stellen mittels
abgesichert. Es gibt nur eine Stelle, an der ich noch eine ClassCastException provozieren kann, wo ich nicht weiß wieso, da eigentlich alles wichtige im EDT vorhanden sein müsste.
Also ich habe einen Thread, der NICHT an den EDT übergeben wird, stattdessen, ruft dieser immer eine Funktion auf, die ein Objekt in das gezeichnete JPanel in der GUI packt.
Genau dieses panel.add(component) habe ich an den EDT übergeben.
Ungefähr so (die markierten Stellen zeigen die Übergabe and en EDT):
Jetzt hab ich das Problem, dass wenn ich, während der Thread läuft, der diese Funktion immer wieder aufruft, immer die Exception bekomme, wenn ich auf genau einem der MoviePanelSmall, die hier hinzugefügt werden, den MouseListener aktiviere. Also die Klasse MoviePanelSmall implementiert den MouseListener und via Doppelklick wird dann ein neuer Tab hinzugefügt in das JTabbedPane, in welchem sich auch das MainPanel befindet, wo die Komponenten aus der add-method eingefügt werden.
Dafür hatte ich mich auch von JTabbedPane abgeleitet und eine addNewTab-Methode geschrieben, die an der entsprechenden Stelle auch an den EDT übergeben wird. Trotzdem erhalte ich bei dieser Aktion ständig eine ClassCastException.
Ich habe auch schon zur Laufzeit mittels System.out.println(SwingUtilities.isEventDispatchThread()); überprüft, ob zum gegebenen Zeitpunkt alles im EDT ist. Dies scheint der Fall zu sein, nur dass die Komponenten zum Zeitpunkt ihrer Erzeugung halt nicht im EDT sind, was sie ja auch nicht sein sollen. Also die Komponenten werden zusammengeklemmpnert auch Bilder dazu, die in JPanels gezeichnet werden (wo die ClassCastExceptions auch immer rauf zu verweisen scheinen aber eine übergabe an den EDT hilft nicht an den Stellen) und erst dann werden sie an das gezeichnete Panel übergeben, wo die oben genannte Funktion halt für aufgerufen wird. Wenn ich währenddessen aber noch ein anderes Objekt an den EDT übergebe, scheint es Probleme zu geben...
Ich hoffe, dass ich mein Problem verständlich machen konnte und hoffe, dass mir da jemand weiterhelfen kann. Danke schonmal
Ich habe eigentlich alle wichtigen Stellen mittels
Java:
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
...
}
});
abgesichert. Es gibt nur eine Stelle, an der ich noch eine ClassCastException provozieren kann, wo ich nicht weiß wieso, da eigentlich alles wichtige im EDT vorhanden sein müsste.
Also ich habe einen Thread, der NICHT an den EDT übergeben wird, stattdessen, ruft dieser immer eine Funktion auf, die ein Objekt in das gezeichnete JPanel in der GUI packt.
Genau dieses panel.add(component) habe ich an den EDT übergeben.
Ungefähr so (die markierten Stellen zeigen die Übergabe and en EDT):
Java:
private void addMovie(final Movie m, final int index, final boolean moveScrollPane){
int page = index / MainComponents.SHOWN_MOVIES;
int currentPage = StaticGuiComponents.getCurrentPage();
if(currentPage == page || this.getComponentCount() < MainComponents.SHOWN_MOVIES){
final MoviePanelSmall mps = new MoviePanelSmall(m);
final JLayer layer = new JLayer(mps, new MarkedLayerUI());
final JComponent content = mps;
EventQueue.invokeLater(new Runnable(){ //--------------------------------------------
@Override
public void run() {
if(getComponentCount() == MainComponents.SHOWN_MOVIES){
((MoviePanelSmall)getComponent(getComponentCount()-1)).deleteFromModel();
remove(getComponentCount()-1);
if(index != -1){
add(content, index % MainComponents.SHOWN_MOVIES);
}else{
add(content);
}
}else{
add(content);
}
MainComponents.showComponents();
if(moveScrollPane){
int position = mps.getLocation().y;
scroll.getVerticalScrollBar().setValue(position);
}
}
});//---------------------------------------------------------------------------------
}
}
Jetzt hab ich das Problem, dass wenn ich, während der Thread läuft, der diese Funktion immer wieder aufruft, immer die Exception bekomme, wenn ich auf genau einem der MoviePanelSmall, die hier hinzugefügt werden, den MouseListener aktiviere. Also die Klasse MoviePanelSmall implementiert den MouseListener und via Doppelklick wird dann ein neuer Tab hinzugefügt in das JTabbedPane, in welchem sich auch das MainPanel befindet, wo die Komponenten aus der add-method eingefügt werden.
Dafür hatte ich mich auch von JTabbedPane abgeleitet und eine addNewTab-Methode geschrieben, die an der entsprechenden Stelle auch an den EDT übergeben wird. Trotzdem erhalte ich bei dieser Aktion ständig eine ClassCastException.
Ich habe auch schon zur Laufzeit mittels System.out.println(SwingUtilities.isEventDispatchThread()); überprüft, ob zum gegebenen Zeitpunkt alles im EDT ist. Dies scheint der Fall zu sein, nur dass die Komponenten zum Zeitpunkt ihrer Erzeugung halt nicht im EDT sind, was sie ja auch nicht sein sollen. Also die Komponenten werden zusammengeklemmpnert auch Bilder dazu, die in JPanels gezeichnet werden (wo die ClassCastExceptions auch immer rauf zu verweisen scheinen aber eine übergabe an den EDT hilft nicht an den Stellen) und erst dann werden sie an das gezeichnete Panel übergeben, wo die oben genannte Funktion halt für aufgerufen wird. Wenn ich währenddessen aber noch ein anderes Objekt an den EDT übergebe, scheint es Probleme zu geben...
Ich hoffe, dass ich mein Problem verständlich machen konnte und hoffe, dass mir da jemand weiterhelfen kann. Danke schonmal