Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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:
@Override
public Object getChild(final Object paramParent, final int paramIndex) {
final IItem parentNode = (IItem)paramParent;
final long parentNodeKey = parentNode.getNodeKey();
mRTX.moveTo(parentNodeKey);
switch (parentNode.getKind()) {
case ROOT_KIND:
assert paramIndex == 0;
mRTX.moveToFirstChild();
return mRTX.getNode();
case ELEMENT_KIND:
// Namespaces.
final int namespCount = ((ElementNode)parentNode).getNamespaceCount();
if (paramIndex < namespCount) {
if (!mRTX.moveToNamespace(paramIndex)) {
throw new IllegalStateException("No namespace with index " + paramIndex + " found!");
}
return mRTX.getNode();
}
// Attributes.
final int attCount = ((ElementNode)parentNode).getAttributeCount();
if (paramIndex < (namespCount + attCount)) {
if (!mRTX.moveToAttribute(paramIndex - namespCount)) {
throw new IllegalStateException("No attribute with index " + paramIndex + " found!");
}
return mRTX.getNode();
}
// Children.
final long 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 {
throw new IllegalStateException("May not happen!");
}
default:
return null;
}
}
Die anderen Methoden sind eigentlich völlig trivial implementiert, bis auf getIndexOfChild(final Object paramParent, final Object paramChild), das aber ohne setzen von