JTree und die Datenbank

Von: , Frage gestellt am Do, 13. Mai 2004

Hallo liebe Experten,

ich brauche mal wieder etwas Hilfe...
Wir möchten unsere Produktgruppen in einer Baumstruktur verwalten. Auf der Client-Seite verwenden wir Swing, die Datenbankzugriffe erfolgen über SessionBeans, welche das Hibernate Framework benützt.

Ich habe mit JTree nocht nicht gearbeite, und die Tutorial denken leider nur statische Strukturen ab.

Folgende Anforderungen sind zu erfüllen:
1. Aus Perfomancegründen kann der ganze Baum nicht auf einmal
eingelesen werden. Statt dessen währe es wünschenswert, die
Produktgruppen erst einzulesen, wenn diese auch angezeigt werden
sollen (Lazy Loading Mechanismus)

2. Das Ändern der Produktgruppenstruktur ist eine der beliebtesten
Aufgaben des Produktmanagements. Die Baumstruktur muss also bei
Änderungen an allen Clients aktualisiert werden (durch öffnen und
schließen des Knotens, wie es beim Windows Explorer der Fall ist).

Meine Frage nun: wie und wo implementiere ich Zugriffen auf die Geschäftslogik? Dem MVC Paradigma zufolge müsse das TreeModel die Anfragen an die Geschäftsschicht weiter leiten. Aus Perfomancegründen ist das aber unsinnig. Sehr viel versprechender erweist sich die Verlagerung des Business-Delegate in den TreeNode. Leider habe ich nicht die Erfahrung mit Swing, um sagen zu können, ob das eine gute Idee ist. Einen Prototyp habe ich einmal erstellt:

public class ProduktgruppenTreeNode implements MutableTreeNode {
private Vector children;
private MutableTreeNode parent;
private ProduktgruppeDTO userObject;
/**
* Constructor for ProduktgruppenTreeNode.
*/
private ProduktgruppenTreeNode() {
super();
}
public ProduktgruppenTreeNode(ProduktgruppeDTO userObject) {
setUserObject(userObject);
}
public static ProduktgruppenTreeNode ROOT_NODE() {
ProduktgruppenService produktgruppenService =
ProduktgruppenServiceFactory
.getInstance()
.getProduktgruppenService();
return new ProduktgruppenTreeNode(produktgruppenService.getRootNode());
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return userObject.toString();
}
// Tree Node Implementation
private Vector getChildren() {
if (children == null) {
children = new Vector();
ProduktgruppenService produktgruppenService =
ProduktgruppenServiceFactory
.getInstance()
.getProduktgruppenService();
ProduktgruppeDTO[] produktgruppen =
produktgruppenService.getUntergeordneteProduktgruppen(userObject.getId());
for (int i = 0; i < produktgruppen.length; i++) {
insert(new ProduktgruppenTreeNode(produktgruppen[i]), i);
}
}
return children;
}
/**
* @see javax.swing.tree.TreeNode#getChildCount()
*/
public int getChildCount() {
return getChildren().size();
}
/**
* @see javax.swing.tree.TreeNode#getAllowsChildren()
*/
public boolean getAllowsChildren() {
return true;
}
/**
* @see javax.swing.tree.TreeNode#isLeaf()
*/
public boolean isLeaf() {
return getChildren().size() == 0;
}
/**
* @see javax.swing.tree.TreeNode#children()
*/
public Enumeration children() {
return children.elements();
}
/**
* @see javax.swing.tree.TreeNode#getParent()
*/
public TreeNode getParent() {
return parent;
}
/**
* @see javax.swing.tree.TreeNode#getChildAt(int)
*/
public TreeNode getChildAt(int childIndex) {
return (TreeNode) getChildren().get(childIndex);
}
/**
* @see javax.swing.tree.TreeNode#getIndex(TreeNode)
*/
public int getIndex(TreeNode node) {
return getChildren().indexOf(node);
}
// Mutable Tree Node
/**
* @see javax.swing.tree.MutableTreeNode#insert(MutableTreeNode, int)
*/
public void insert(MutableTreeNode child, int index) {
child.setParent(this);
getChildren().add(index, child);
}
/**
* @see javax.swing.tree.MutableTreeNode#remove(int)
*/
public void remove(int index) {
throw new IllegalAccessError("Not yet implemented");
}
/**
* @see javax.swing.tree.MutableTreeNode#remove(MutableTreeNode)
*/
public void remove(MutableTreeNode node) {
throw new IllegalAccessError("Not yet implemented");
}
/**
* @see javax.swing.tree.MutableTreeNode#removeFromParent()
*/
public void removeFromParent() {
throw new IllegalAccessError("Not yet implemented");
}
/**
* @see javax.swing.tree.MutableTreeNode#setParent(MutableTreeNode)
*/
public void setParent(MutableTreeNode newParent) {
this.parent = newParent;
}
/**
* @see javax.swing.tree.MutableTreeNode#setUserObject(Object)
*/
public void setUserObject(Object object) {
if (object == null) {
throw new IllegalArgumentException("NULL Produktgruppe ist nicht erlaubt");
}
if (!(object instanceof ProduktgruppeDTO)) {
throw new IllegalArgumentException("Erwarte Objekt vom Typ ProduktgruppeDTO");
}
this.userObject = (ProduktgruppeDTO) object;
}


Für euere Meinungen und Designvorschläge bin ich sehr dankbar.

Mfg,

Andreas

0 Antworten zu dieser Frage

    Keine passende Antwort gefunden? Jetzt eigene Frage stellen!