ich habe ich ein Programm, dass aus 3 Threads besteht:
im ersten Thread (also in der main()) werden UI-Komponenten gestartet. danach wird das eigentliche Programm in einem neuen Thread gestartet. einzelne methoden des hauptprogramms werden über Buttons gestartet. hie und da braucht eine solche Methode dann noch eine Eingabe vom User und kann erst weitermachen, wenn diese da ist (da hab ich busy-waiting mit sleep() kombiniert). das UserInterface läuft aber in einem anderen Thread und das ganze funktioniert daher auch ohne probleme. (mit einem Thread war das UserInterface bei mir tot, während es in der anderen Methode wartete)
nun will ich jetzt noch einen dritten Thread machen, der die Aufgabe übernimmt das Programm "weiterzuklicken". sprich es gibt einen Button "weiter", der sehr oft gedrückt werden muss. der thread übernimmt das auf wunsch (das programm läuft dann über weite teile automatisiert ab.
die methode, die vom weiter-button aufgerufen wird, hat zur folge, dass einige ui-komponenten hinzugefügt/geändert werden.
und jetzt das problem:
wenn ich diesen thread mit automatischen klicks aus dem zweiten Thread heraus starte (also aus dem hauptprogramm), dann bekomme ich regelämßig folgenden error:
java.lang.ArrayIndexOutOfBoundsException: No such child: 13
at java.awt.Container.getComponent(Unknown Source)
at javax.swing.JComponent.rectangleIsObscured(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
die zahl (13) ändert sich ständig. der fehler tritt immer an anderen Stellen auf. die geschwindigkeit, mit der weitergeklickt wird, ist egal. also wenn ich zB die klicks mit einem Delay von einer Sekunde einstelle, dannn bekomme ich trotzdem die errors. wenn ich per hand weiterklicke, bekomme ich die errors nicht (auch wenn ich viel schneller klicke)
es hat also wohl etwas damit zu tun, dass die methodenaufrufe von einem anderen thread kommen.
(nehme ich an)
wenn ich nun den Klick-Thread nicht aus dem hauptprogramm starte sondern aus der UI-Komponente, wo normal auch der Button geklickt wird, dann habe ich genau dasselbe problem.
wenn ich den Thread aber aus der main-methode heraus starte, dann bekomme ich den error nicht mehr.
meine kurze und eindeutige frage: warum?
(mein problem ist gelöst, aber ich würde gerne verstehen, worauf ich da genau aufpassen muss)
thx!
im ersten Thread (also in der main()) werden UI-Komponenten gestartet. danach wird das eigentliche Programm in einem neuen Thread gestartet. einzelne methoden des hauptprogramms werden über Buttons gestartet. hie und da braucht eine solche Methode dann noch eine Eingabe vom User und kann erst weitermachen, wenn diese da ist (da hab ich busy-waiting mit sleep() kombiniert). das UserInterface läuft aber in einem anderen Thread und das ganze funktioniert daher auch ohne probleme. (mit einem Thread war das UserInterface bei mir tot, während es in der anderen Methode wartete)
nun will ich jetzt noch einen dritten Thread machen, der die Aufgabe übernimmt das Programm "weiterzuklicken". sprich es gibt einen Button "weiter", der sehr oft gedrückt werden muss. der thread übernimmt das auf wunsch (das programm läuft dann über weite teile automatisiert ab.
die methode, die vom weiter-button aufgerufen wird, hat zur folge, dass einige ui-komponenten hinzugefügt/geändert werden.
und jetzt das problem:
wenn ich diesen thread mit automatischen klicks aus dem zweiten Thread heraus starte (also aus dem hauptprogramm), dann bekomme ich regelämßig folgenden error:
java.lang.ArrayIndexOutOfBoundsException: No such child: 13
at java.awt.Container.getComponent(Unknown Source)
at javax.swing.JComponent.rectangleIsObscured(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
die zahl (13) ändert sich ständig. der fehler tritt immer an anderen Stellen auf. die geschwindigkeit, mit der weitergeklickt wird, ist egal. also wenn ich zB die klicks mit einem Delay von einer Sekunde einstelle, dannn bekomme ich trotzdem die errors. wenn ich per hand weiterklicke, bekomme ich die errors nicht (auch wenn ich viel schneller klicke)
es hat also wohl etwas damit zu tun, dass die methodenaufrufe von einem anderen thread kommen.
(nehme ich an)
wenn ich nun den Klick-Thread nicht aus dem hauptprogramm starte sondern aus der UI-Komponente, wo normal auch der Button geklickt wird, dann habe ich genau dasselbe problem.
wenn ich den Thread aber aus der main-methode heraus starte, dann bekomme ich den error nicht mehr.
meine kurze und eindeutige frage: warum?
(mein problem ist gelöst, aber ich würde gerne verstehen, worauf ich da genau aufpassen muss)
thx!