Swing jTree + MySql Befüllungsproblem

Oldboii

Mitglied
Also hi erstmal,

das ist das erste mal für mich in diesem Forum. Und ich komme auch nur aus purer
Verzweiflung hier angekrochen. Ich würde mich immer noch als Java Anfänger bezeichnen,
auch nach 3 Jahren Programmieren in meinem Studium.

Also ich habe folgendes Problem, welches ich auch schon in sämtlichen Varianten etc. mit
google gesucht habe, und habe auch einige Tutorials etc. gefunden die aber alle leider nicht
bei meinem gedanklichen Problem helfen.

So endlich zum Problem:
Ich hatte am Anfang meines Projekts die Idee nen schönen einfachen jTree zum navigieren
einzubauen, und wusste leider nicht was da auf mich zukommt.
Im Hintergrund befindet sich jetzt eine kleine aber evlt. bald riesige DB mit z.B. Geräten;
meine Geräte haben Kategorien und wiederrum Typen, alles hat auch schön nochmal ne eigene
ID etc. Hier ne BeispielAbfrage:
Select Kategorie.KategorieID, Kategorie.Kategorie, Typ From Kategorie JOIN Typ ON KategorieID = Typ.Kategorie
Ergebnis:
KategorieID: Kategorie: Typ:
1 Allgemeine Geräte Drucker
1 Allgemeine Geräte Mehrkopfwaage
3 Produktion Tiefziehmaschine

So und jetzt will ich nen Tree mit Hilfe z.B. dieser Abfrage gestalten. Die Schranke in meinem Gehirn
liegt jetzt an folgendem Punkt. Anfangs wollte ich die Abfrage ohne KategorieID in eine ArrayList packen die ArrayList dann in das Object hierarchy packen und daraus die gesamte Baumhierarchie
gestalten... eigentlich ganz schön, aber hätte mir klar sein müssen, dass ich jetzt doppelte Knoten erhalten:
root
Allgemeine Geräte
Drucker
Allgemeine Geräte
Mehrkopfwaage

usw.
Dann hatte ich vor die ArrayList irgendwie mit nem iterated HashSet von doppelten Werten zu bereinigen, die Idee hab ich aber gar nicht erst fertig probiert, weil dann sicher die Beziehung von Kategorie und Typ verloren gegangen wäre und ich nur Müll bekommen hätte.
Meine nächste Idee die eigentlich klappen könnte ist folgende, das ich die Hauptstruktur fülle indem ich nur die Kategorien abfrage welche dann die Parentnodes darstellen und vorerst keine Kinder haben, sondern die Kinder extra durch einen WillExpandListener und eine entsprechende extra neue Abfrage "... Where '"getselectedTreePath"' = Kategorie.." oder so ähnlich. Allerdings macht mir
hier zu Anfang gleich mal der DefaultMutableTreeNode einen Strich durch die Rechnung, weil die
nodes ohne childs schonmal gar nicht mehr expandeble sind.
Hier z.B. ist eine extrem kranke Lösung, die für meinen JTree aber auch nicht klappt und zu übertrieben ist (Drag n Drop etc.) http://sites.google.com/site/uhilger/artikel_index/boundtree

Ich hoffe irgendjemand findet die Zeit meinen riesen Thread durchzulesen und auch alles zu verstehen, was ich nicht hinbekomme.
Übrigens wer sich jetzt unbedingt einbilden will, das ich meine Arbeit gemacht haben will etc. etc., der soll doch bitte einfach gehen.. ich möchte lediglich einen anständigen Denkanstoß und jemand der mich vom Schlauch schubst auf dem ich gerade stehe. Thx
 

Michael...

Top Contributor
Da gibt's diverse Möglichkeiten z.B.:
1) Man schreibt ein eigenes TableModel, das mit der ArrayList umgehen kann
2) man sortiert im SQL nach der ID und überprüft beim erzeugen des Baums, ob die Kategorie des aktuellen Typs noch der des Vorgängers entspricht. Wenn nicht fügt man einen neuen Knoten mit der neuen Kategorie in den Baum ein und fügt darin, die alle darauffolgenden Typen ein, bis wieder eine neue Kategorie in der List kommt
3) man erfragt per Statement erst einmal nur die Kategorien und während man den Baum mit den Kategorien befüllt, erfragt man in einem zweiten Statement die Typ der jeweiligen Kategorie
4) man befüllt den Baum erst einmal nur mit den Kategorien und lädt die Typen im Bedarfsfall nach, damit Kategorieknoten vom Anwender expandiert werden können bzw. als expandierbar erkannt werden fügt man zunächst einen Dummyknoten ein oder markiert sie mit einem speziellen Icon

Ich persönlich würde in dem Fall Variante 2 und 3 bevorzugen, danach Variante 1 und im äussersten Notfall Variante 4
 

Oldboii

Mitglied
Danke für die schnelle Antwort Michael. Ich weiß jetzt zwar spontan noch nicht wie ich deine Vorschläge Codetechnisch angehen soll (weil ichn boon bin), aber ich find die Varianten 2 und 3 auch sehr plausibel. Ich werd mich jetzt erstmal mit Variante 3 beschäftigen... Variante 4 ist ja ungefähr so wie ich es schonmal vor hatte (WillExpandListener); gut zu wissen das die nur für den äussersten Notfall gut wäre.
Ich glaub mein neues Experiment was ich gerade angefangen habe, ähnelt der Variante 3.

Java:
package test;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
import java.util.List;

public class Test extends JFrame {
    public Test() {
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	Container content = getContentPane();
	JTree jt = new JTree(new RefTreeNode());
	content.add(new JScrollPane(jt));
	setSize(200,200);
	show();
    }
    public static void main(String[] args) { new Test(); }
}
class RefTreeNode extends DBZugriff implements TreeNode{
	   List<RefTreeNode> children = new ArrayList<RefTreeNode>();
	   String displayName = null;
	   RefTreeNode parent = null;
	   transient int parentid = -1;
	   
	   public TreeNode getParent() { return parent;}
	   public Enumeration<RefTreeNode> children() {
	      return Collections.enumeration(children);
	   }
	   public boolean isLeaf() {
	       return children.size()==0;
	   }
	   public boolean getAllowsChildren() {
	       return !isLeaf();
	   }
	   public int getChildCount() {return children.size();}
	   public int getIndex(TreeNode tn) {
	       return children.indexOf(tn);
	   }
	   public TreeNode getChildAt(int index) {
	       return (TreeNode)children.get(index);
	   }
	   // used by the default renderer
	   public String toString() {
	       return displayName;
	   }
	   // use this method to create the root node
	   // from a result set;
	   // assumption: first: id, second: display name, third: parent id
	   public static RefTreeNode createRootFor(ResultSet rs) 
	       throws SQLException
	   {
	       // preserves insertion order
	       Map<Integer, RefTreeNode> nodes = new LinkedHashMap<Integer, RefTreeNode>();
	       RefTreeNode root = null;
	       while(rs.next()) {
	    	   String sql = "Select Kategorietyp.ID, Kategorie.Kategorie, TypID From Kategorietyp " +
	    	   		"JOIN Kategorie ON Kategorietyp.KategorieID = Kategorie.KategorieID";
	    	   Statement st = con.createStatement();
	    	   rs = st.executeQuery(sql);
	    	   
	           RefTreeNode tmp = new RefTreeNode();
	           tmp.displayName = rs.getString(2);
	           tmp.parentid = rs.getInt(3);
	           nodes.put(new Integer(rs.getInt(1)), tmp);
	           if(tmp.parentid==rs.getInt(1)) root = tmp;
	       }
	       // important!
	       rs.close();
	       for(Iterator<RefTreeNode> iter = nodes.values().iterator(); iter.hasNext();){
	          RefTreeNode n = (RefTreeNode)iter.next();
	          if(n!=root) {
	             Integer i = new Integer(n.parentid);
	             RefTreeNode parent = (RefTreeNode)nodes.get(i);
	             parent.children.add(n);
	             n.parent = parent;
	          }
	       }
	       return root;
	   }
}
 

Oldboii

Mitglied
peinlich peinlich :oops:.. aber jetzt nach insgesamt fast einer Woche hab ichs doch endlich so wie ich es haben wollte.
Aber mein Bauchgefühl sagt mir das der jTree noch so einiges auf Lager hat um mich fertig zu machen.
Als nächstes werd ich mich jetzt ran hocken und den jTree mit nem Table verbinden.
Meine Lösung übrigens:
- Abfrage schicken/empfangen
- (ID) Kategorie, Typ jeweils in nen String packen (rs.getString(1).. usw.)
- diese in nen String[] baum z.B.
- und ner ArrayList<String[]> den String[]baum adden
- in der DefaultMutableTreeNode mit zwei Schleifen (for (String[] : blubb)) die Hierarchie festlegen
- fertig

Wer das hier liest und auch schon seit Stunden/Tagen oder länger vor dem jTree sitzt und nen Knoten im Hirn bekommt.. ich schätze ich kann inzwischen gute Hilfe leisten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrittenFritze JTree, LazyLoading und "Rückwärtstraversion" AWT, Swing, JavaFX & SWT 3
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
F Jtree aus Klasse mit Arraylisten AWT, Swing, JavaFX & SWT 1
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
Z Swing JTree DefaultMultipleTreeNode Repräsentation ändern AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
W Swing Anzeigefehler bei JTree AWT, Swing, JavaFX & SWT 1
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
S JRadioButton und JCheckBox im JTree AWT, Swing, JavaFX & SWT 14
H Swing JTree: Zählt der rootNode mit? AWT, Swing, JavaFX & SWT 2
krgewb Swing JTree - Farbe von nodes ändern AWT, Swing, JavaFX & SWT 4
R JTree behandeln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
T JTree mit Symbolen? AWT, Swing, JavaFX & SWT 8
R Anfängerfrage: Ansichten des JTree AWT, Swing, JavaFX & SWT 1
H Swing JTree Minimumgröße AWT, Swing, JavaFX & SWT 2
F Swing JTree + DiffUtils // Markierung Nodes aufheben AWT, Swing, JavaFX & SWT 2
I JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Swing JTree AWT, Swing, JavaFX & SWT 4
M Nodes in JTree nicht anzeigen AWT, Swing, JavaFX & SWT 0
T JTree mit Cloud verbinden AWT, Swing, JavaFX & SWT 0
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
J Auf Dateien in JTree zugreifen AWT, Swing, JavaFX & SWT 15
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
D Swing JTree Steuerung AWT, Swing, JavaFX & SWT 11
S Swing JTree verwirrt mich AWT, Swing, JavaFX & SWT 2
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
J JTree speichern AWT, Swing, JavaFX & SWT 4
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
B JTree mit Ordneransicht in JPanel einbinden AWT, Swing, JavaFX & SWT 4
D JTree node reagiert bei Klick nicht immer AWT, Swing, JavaFX & SWT 2
M Swing JTree: Wie kann ich die Hintergrundfarbe der selection ändern?!?! AWT, Swing, JavaFX & SWT 7
D Mehrmals auf Node im JTree klicken AWT, Swing, JavaFX & SWT 2
D JSplitPane, Jtree, CardLayout (constraint must be a string) AWT, Swing, JavaFX & SWT 9
N Swing FileFilter lässt JTree sich nicht öffnen AWT, Swing, JavaFX & SWT 2
X Swing 2 TreeModel und ein JTree synchronisieren AWT, Swing, JavaFX & SWT 3
N Swing JTree TreePath zu Windows Pfad? AWT, Swing, JavaFX & SWT 2
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
X Swing JTree aktualisieren AWT, Swing, JavaFX & SWT 2
V Swing JTree - Umbenennen selbst handlen. AWT, Swing, JavaFX & SWT 2
E Übergebenem JTree Blätter hinzufügen AWT, Swing, JavaFX & SWT 2
E Wert eines selektierten Knotens in einem JTree auslesen AWT, Swing, JavaFX & SWT 3
A Swing JTree - Nodes expanden AWT, Swing, JavaFX & SWT 2
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
B JTree AWT, Swing, JavaFX & SWT 9
T Menüacceleratoren verschwinden bei JTree AWT, Swing, JavaFX & SWT 5
1 Swing JTree collapse child nodes AWT, Swing, JavaFX & SWT 4
B JTree - sehr individuell AWT, Swing, JavaFX & SWT 3
G Swing JTree - Verbindungslinien entfernen AWT, Swing, JavaFX & SWT 4
A Swing Herausfinden ob bei JTree Klick auf "+"/"-" anahnd x,y AWT, Swing, JavaFX & SWT 2
S Swing JTree und seine Listener... AWT, Swing, JavaFX & SWT 4
L Swing JTree wird nicht selektiert AWT, Swing, JavaFX & SWT 2
P [JTree] Markierhilfe der Drop-Location selber gestalten. AWT, Swing, JavaFX & SWT 4
A JTree aus Pfaden erzeugen AWT, Swing, JavaFX & SWT 3
K Swing Hilfe beim JTree! AWT, Swing, JavaFX & SWT 3
X Datensätze in JTree AWT, Swing, JavaFX & SWT 2
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
E JTree Auswahl AWT, Swing, JavaFX & SWT 2
K JTree width der Treenodes auf 100% AWT, Swing, JavaFX & SWT 6
C JTree LastSelectedPathComponent benutzen? AWT, Swing, JavaFX & SWT 3
S Swing JTree Node Text nicht richtig angezeigt AWT, Swing, JavaFX & SWT 2
Landei Swing JTree mit "Tabellenzeilen"? AWT, Swing, JavaFX & SWT 5
Rudolf Swing JTree Node anhand vom Namen finden AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
Z JTree rootChilds AWT, Swing, JavaFX & SWT 2
D JTree DefaultMutableTreeNode ActionPerformed AWT, Swing, JavaFX & SWT 3
T JTree Daten in DB schreiben am besten SQL AWT, Swing, JavaFX & SWT 21
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
J Lazy Loading eine JTree während Scrollen AWT, Swing, JavaFX & SWT 11
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
E Swing JTree AWT, Swing, JavaFX & SWT 2
J Swing Lazy Loading in JTree wenn gescrollt wird AWT, Swing, JavaFX & SWT 3
N Knotenanordnung in JTree AWT, Swing, JavaFX & SWT 4
S JTree mit Liste zur Speicherung AWT, Swing, JavaFX & SWT 3
S Jtree CheckNode mit JPanel AWT, Swing, JavaFX & SWT 32
G JTree entfernt Nodes nicht AWT, Swing, JavaFX & SWT 12
C Swing JTree und TreeModel AWT, Swing, JavaFX & SWT 15
S Swing JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
J JTree AWT, Swing, JavaFX & SWT 2
R [JTree/DefaultTreeCellRenderer] eigenes Renderer-Panel, so breit wie der JTree AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
E Swing JTree setSelectedPath funktioniert nicht?! AWT, Swing, JavaFX & SWT 5
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4
S JTree aus List<File> erstellen AWT, Swing, JavaFX & SWT 8
C Swing MouseEntered(?) für jeden Node im JTree AWT, Swing, JavaFX & SWT 4
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
C Swing JTree UI Probleme AWT, Swing, JavaFX & SWT 6
G JTree - Observer oder Listener? AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben