ich habe irgendwo einen Bug in meinem TreeModel, allerdings finde ich ihn absolut nicht Ist das eigentlich normal, dass getIndexOfChild(final Object paramParent, final Object paramChild) nie aufgerufen wird, solange man kein large model festlegt? Ich glaube eigentlich nicht...
Worauf basiert Deine Erwartungshaltung, dass diese Methode aufgerufen werden muss?
Und was hat das mit large Model zu tun? Ich kenne letzters nur als ein Hinweis an das UI das diese Information nutzen oder ignorieren kann.
Das TreeModel dürfte öfter aufgerufen werden, weil nichts gecached wird und nur Einträge/Indexpositionen im sichtbaren Bereich angezeigt werden, IIRC. Also bei setLargeModel(true). Ich poste jetzt einfach mal etwas Code, vll. fällt ja jemandem der Fehler sofort auf. Es handelt sich um eine Datenstruktur eines XML-Datenbanksystems, wobei mRTX ein Cursor ist, der bewegt wird. Namespaces werden als erste Kinder ausgegeben, danach Attribute, danach erst die eigentlichen Kindknoten. Ich kann ja im Debugger verfolgen, dass jedesmal der richtige Knoten zurückgegeben wird.
Java:
@OverridepublicObjectgetChild(finalObject paramParent,finalint paramIndex){finalIItem parentNode =(IItem)paramParent;finallong parentNodeKey = parentNode.getNodeKey();
mRTX.moveTo(parentNodeKey);switch(parentNode.getKind()){case ROOT_KIND:assert paramIndex ==0;
mRTX.moveToFirstChild();return mRTX.getNode();case ELEMENT_KIND:// Namespaces.finalint namespCount =((ElementNode)parentNode).getNamespaceCount();if(paramIndex < namespCount){if(!mRTX.moveToNamespace(paramIndex)){thrownewIllegalStateException("No namespace with index "+ paramIndex +" found!");}return mRTX.getNode();}// Attributes.finalint attCount =((ElementNode)parentNode).getAttributeCount();if(paramIndex <(namespCount + attCount)){if(!mRTX.moveToAttribute(paramIndex - namespCount)){thrownewIllegalStateException("No attribute with index "+ paramIndex +" found!");}return mRTX.getNode();}// Children.finallong childCount =((ElementNode)parentNode).getChildCount();if(paramIndex <(namespCount + attCount + childCount)){// if (!mRTX.moveToFirstChild()) {// throw new IllegalStateException("No node with index " + paramIndex + " found!");// }// final long upper = paramIndex - namespCount - attCount;// for (long i = 0; i < upper; i++) {// if (!mRTX.moveToRightSibling()) {// throw new IllegalStateException("No node with index " + paramIndex + " found!");// }// }for(int i =0; i < childCount; i++){if(i ==0){
mRTX.moveToFirstChild();}else{
mRTX.moveToRightSibling();}if(paramIndex == namespCount + attCount + i){break;}}return mRTX.getNode();}else{thrownewIllegalStateException("May not happen!");}default:returnnull;}}
Die anderen Methoden sind eigentlich völlig trivial implementiert, bis auf getIndexOfChild(final Object paramParent, final Object paramChild), das aber ohne setzen von