# Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1



## Xearox (26. Aug 2016)

Moin moin,

ich erhalte hierbei immer wieder den unten angegeben Fehler. Leider lässt sich aus dem StackTrace nicht heraus lesen, wo dieser ganz genau sein soll. Ich konnte es aber auf den Code Ausschnitt dezimieren.

Btw. ist das die einzige Möglichkeit, auf eine Sub-Componente im JTabbedPane zuzugreifen? Oder kann man auch direkt auf die entsprechende Componente drauf zu greifen, vielleicht liegt hier schon der Fehler.

Die TabbedPane ist als Variable statisch in der Hauptklasse Client deklariert und wird beim starten instanziert. Gleiche gilt für das TextPane, ebenfalls statisch deklariert. Anders wusste ich mir nicht zu helfen, um auf die Entsprechenden Komponenten zuzugreifen von einer anderen Klasse aus.

Die Klasse, in der der Codeausschnitt hinterlegt ist, wird von der Hauptklasse beim starten instanziert.


```
boolean tabExists = false;
                    for(int i = 0; i < Client.tabbedPane.getTabCount(); i++){
                        if(Client.tabbedPane.getTitleAt(i).equalsIgnoreCase(sender)){
                            JPanel jPanel = null;
                            Component component = Client.tabbedPane.getComponent(i);
                            if(component instanceof JPanel){
                                jPanel = (JPanel) component;
                                component = jPanel.getComponent(1);
                                if(component instanceof JScrollPane){
                                    JScrollPane jScrollPane = (JScrollPane) component;
                                    component = jScrollPane.getComponent(0);
                                    if(component instanceof JViewport){
                                        JViewport jViewport = (JViewport)component;
                                        component = jViewport.getComponent(0);
                                        if(component instanceof JTextPane){
                                            JTextPane textPane = (JTextPane)component;
                                            HTMLEditorKit eKit = new HTMLEditorKit();
                                            textPane.setEditorKit(eKit);
                                            String txt = client.createHTMLText(textPane.getText(), sender, message);
                                            client.appendNewText(textPane, txt);
                                            Client.jTextPaneChatHistory = textPane;
                                        }
                                    }
                                 
                                }
                            }
                            tabExists = true;
                        }
                    }
```


```
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at javax.swing.text.BoxView.getOffset(BoxView.java:1101)
    at javax.swing.text.BoxView.childAllocation(BoxView.java:695)
    at javax.swing.text.CompositeView.getChildAllocation(CompositeView.java:232)
    at javax.swing.text.BoxView.getChildAllocation(BoxView.java:453)
    at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.calculateViewPosition(BasicTextUI.java:1999)
    at javax.swing.plaf.basic.BasicTextUI$UpdateHandler.layoutContainer(BasicTextUI.java:1975)
    at java.awt.Container.layout(Container.java:1510)
    at java.awt.Container.doLayout(Container.java:1499)
    at java.awt.Container.validateTree(Container.java:1695)
    at java.awt.Container.validateTree(Container.java:1704)
    at java.awt.Container.validateTree(Container.java:1704)
    at java.awt.Container.validate(Container.java:1630)
    at javax.swing.JViewport.validateView(JViewport.java:482)
    at javax.swing.JViewport.scrollRectToVisible(JViewport.java:393)
    at javax.swing.JComponent.scrollRectToVisible(JComponent.java:3111)
    at javax.swing.text.DefaultCaret.adjustVisibility(DefaultCaret.java:285)
    at javax.swing.text.DefaultCaret.repaintNewCaret(DefaultCaret.java:1313)
    at javax.swing.text.DefaultCaret$1.run(DefaultCaret.java:1287)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
```


Hoffe hier kann mir evtl. jemand helfen =) Danke


----------



## JCODA (26. Aug 2016)

Es ist meistens keine gute Idee den Componenten-Baum zu durchlaufen.
Du erstellst doch an anderer Stelle bestimmt die JTextPane, die du "rausfischen" möchtest. Speichere diese in einer Liste ab und übergebe diese Liste an die Klasse, die sie bearbeiten soll.
(Falls es nur eine "richtige" JTextPane gibt, speichere dir ggf. nur eine Referenz, da brauchst du dann keine Liste.)


----------



## Meniskusschaden (26. Aug 2016)

Ich stimme @JCODA zu. Außerdem finde ich die ungeprüften Abfragen `getComponent(1)`bzw.`getComponent(0)`sehr verdächtig. Bist du sicher, dass wirklich jedes Panel zwei Komponenten enthält und jede ScrollPane eine etc.? Und bist du sicher, dass die gewünschte ScrollPane die zweite Komponente ist und nicht die erste oder dritte sein kann? Das sieht ziemlich wackelig aus.


----------



## Xearox (26. Aug 2016)

Meniskusschaden hat gesagt.:


> Ich stimme @JCODA zu. Außerdem finde ich die ungeprüften Abfragen `getComponent(1)`bzw.`getComponent(0)`sehr verdächtig. Bist du sicher, dass wirklich jedes Panel zwei Komponenten enthält und jede ScrollPane eine etc.? Und bist du sicher, dass die gewünschte ScrollPane die zweite Komponente ist und nicht die erste oder dritte sein kann? Das sieht ziemlich wackelig aus.



Also ich bin mir sicher, das jeder tabbedPane Tab die selbe Anzahl an Componenten hat, es sei denn, da ändert sich irgendwas, wovon ich nicht weiß. Einen Tab erstelle ich zur Laufzeit.

@JCODA wenn ich das richtig verstanden habe, soll ich die JTextPane Componente in eine HashMap speichern. Beispiel: HashMap<String, JTextPane> textPaneMap = new HashMap<String, JTextPane>();

String dient dazu, um den Namen des Tabs zu speichern und halt das zweite für die Componente selbst. Anschließend sollte ich ja theoretisch darauf zugreifen können, oder irre ich mich da?


----------



## Meniskusschaden (26. Aug 2016)

Xearox hat gesagt.:


> Also ich bin mir sicher, das jeder tabbedPane Tab die selbe Anzahl an Componenten hat, es sei denn, da ändert sich irgendwas, wovon ich nicht weiß. Einen Tab erstelle ich zur Laufzeit.


Mag sein, dass jeder Tab dieselbe Anzahl an Komponenten hat. Das war aber nicht die Frage. Entscheidend ist, ob jedes JPanel-Objekt mindestens zwei Komponenten enthält. Entsprechend ob jedes JScrollPane, das sich in einem JPanel befindet mindestens eine Komponente enthält und so weiter.


----------



## Xearox (26. Aug 2016)

Meniskusschaden hat gesagt.:


> Mag sein, dass jeder Tab dieselbe Anzahl an Komponenten hat. Das war aber nicht die Frage. Entscheidend ist, ob jedes JPanel-Objekt mindestens zwei Komponenten enthält. Entsprechend ob jedes JScrollPane, das sich in einem JPanel befindet mindestens eine Komponente enthält und so weiter.



Genau, das wollte ich damit Aussagen.
 

Das sollte sich ja während der Laufzeit auch nicht ändern. Nehme ich mal an.
Aber ich bin das grade mit eine HashMap am versuchen, allerdings bin ich grade zu doof dafür, diese vernünftig zu erstellen, bekomme immer eine NPE.


----------



## Xearox (26. Aug 2016)

Funktioniert jetzt aber =) Der Fehler ist fott. Ich danke dir für den Denkanstoß @JCODA das mit der HashMap klappt wunderbar =)

Leider kann ich die Anwendung noch nicht mit mehreren Leuten testen(hab nicht soviele) :/


----------

