Ein Node im JTree soll als Ordner angezeigt werden

Trigoor2

Mitglied
Hallo Leute,

ich würde gerne einen Knoten im JTree als Ordner anzeigen lassen.
Bei mir wird er nur als Ordner angezeigt wenn er Nodes(als childrens) hat.

Irgendwie bin ich auf keine Lösung gekommen.

Vielen Dank im Vorraus!

Viele Grüße
Trigoor
 
Hi,
versuch das Problem doch mit dem CellRenderer zu lösen. Über diesen CellRenderer kannst du die Icons für die Leafs/Root-Points setzen. Du musst natürlich abfragen, ob es das Item ist, dem du ein neues Icon geben willst. Ansonsten änderst du das Icon bei allen. Hier mal ein Code-Beispiel: (ich bin mir nicht sicher, ob du getDefaultLeafIcon oder getLeafIcon überschreiben musst, aber das kannst du ausprobieren)

Java:
import javax.swing.Icon;
import javax.swing.JTree;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;

public class JTreeModifier
{
	private final TreeModel model;
	private final JTree tree;
	
	public JTreeModifier(TreeNode root) {
		model = new DefaultTreeModel(root);
		tree = new JTree(model);
		tree.setCellRenderer(new DefaultTreeCellRenderer() {
			@Override
			public Icon getDefaultLeafIcon() {
				// Hier durch dein Icon ersetzen.
				// Evtl. vorher eine If-Abfrage machen, 
				// ob es das Icon ist, das du ändern willst.
				return super.getDefaultLeafIcon();
			}
			
			@Override
			public Icon getLeafIcon() {
				// Hier durch dein Icon ersetzen.
				// Evtl. vorher eine If-Abfrage machen, 
				// ob es das Icon ist, das du ändern willst.
				return super.getLeafIcon();
			}
		});
	}
}

Gruß

Fabio
 
Hallo Fabio,

hmmm...also ich kriege das mit dem Treemodel nicht hin.
Ist das eine offizielle Klasse von Oracle?

Denn das Package "javax.swing.tree.DefaultTreeModel" erkennt mein Eclipse nicht an.

Gruß
Trigoor
 
Hallo Fabio,

Code:
        	public Icon getDefaultLeafIcon() {
        		// Hier durch dein Icon ersetzen.
        		// Evtl. vorher eine If-Abfrage machen, 
        		// ob es das Icon ist, das du ändern willst.
        		
        		java.net.URL imgURL = frmStart2.class.getResource("c:\\ordner.gif");
        	    ImageIcon icon = new ImageIcon(imgURL);
        	    
        		return super.getDefaultLeafIcon();
        	}
 
Hallo Fabio,

erst einmal vielen Dank für den Codehappen!:p

Habe den kleinen Fehler von vorhin gefunden.

Es heisst: import javax.swing.tree.*;
statt dem hier: import javax.swing.JTree.*;

Sag bloss, Du tippst den Code einfach so frei runter? Ich muss meistens nachschauen wie ich was angestellt habe.:eek:

Bei mir sieht es jetzt so aus:
Code:
        	public Icon getDefaultLeafIcon() {
        		// Hier durch dein Icon ersetzen.
        		// Evtl. vorher eine If-Abfrage machen, 
        		// ob es das Icon ist, das du ändern willst.
        		
        		java.net.URL imgURL = frmStart2.class.getResource("c:\\ordner.gif");
        	        ImageIcon icon = new ImageIcon(imgURL);
        	    
        		return super.getDefaultLeafIcon();
        	}

Wie muss ich denn weiter verfahren?
Also "super" kenne ich nur als erste Zeile unter dem Konstruktor. Was bewirkt er denn in der Return-Anweisung?

Ach, das youtube-Video (Java vs NET) habe ich mir mal angeschaut. Echt lustig.
Muss jetzt seit einer Woche mit VB.NET programmieren. Und vor allen Dingen kommt viel ADO.NET vor.

Ich kann Dir eines sagen. Eclipse ist und bleibt die beste IDE die es gibt. Da kommt .NET mit seiner IntelliSense nicht bei weitem ran.
Das einzig gute ist der DataSet-Designer und das man die DB über .NET verändern kann.
Gibt es für Java auch sowas Ähnliches? Hast Du eine Ahnung?

Welche IDE benutzt Du denn?

Okay, ist schon spät. Muss "heute" um 7.00 aufstehen. Wird Zeit ins heia-Bett zu springen.

Viele Grüße
Trigoor

EDIT: Oje, Doppelpost..peinlich :)
 
Zuletzt bearbeitet:
Hi,

Sag bloss, Du tippst den Code einfach so frei runter? Ich muss meistens nachschauen wie ich was angestellt habe.:eek:
Ja naja, zum teil würd ich sagen. Ich programmier mit Java jetzt schon seit 2 Jahren (Ausbildung) und habe daher die ein oder anderen Sachen bereits verinnerlicht.

Bei mir sieht es jetzt so aus:
Code:
        	public Icon getDefaultLeafIcon() {
        		// Hier durch dein Icon ersetzen.
        		// Evtl. vorher eine If-Abfrage machen, 
        		// ob es das Icon ist, das du ändern willst.
        		
        		java.net.URL imgURL = frmStart2.class.getResource("c:\\ordner.gif");
        	        ImageIcon icon = new ImageIcon(imgURL);
        	    
        		return super.getDefaultLeafIcon();
        	}

Wie muss ich denn weiter verfahren?
Du kannst jetzt die Variable icon direkt zurückgeben via "return icon" (allerdings bekommen dann alle Nodes das Icon als Anzeigebild).

Also "super" kenne ich nur als erste Zeile unter dem Konstruktor. Was bewirkt er denn in der Return-Anweisung?
Da die Methode überschrieben wird, bewirkt "super", dass die Methode den Wert (der in der überschriebenen Methode) zurückgibt. Also mit "super" greifst du immer auf die "Super"-Methode zu. Sprich wenn du eine Klasse einbindest (extend) dann kannst du, wenn du eine Methode überschreibst, via "super" auf die eigentliche Methode zugreifen.
Ich hoffe das ist einigermaßen verständlich rüber gekommen. Falls nicht, habe ich hier noch einen netten Link mit solchen Sachen.

Ach, das youtube-Video (Java vs NET) habe ich mir mal angeschaut. Echt lustig.
Freut mich, dass es dir gefallen hat.

Ich kann Dir eines sagen. Eclipse ist und bleibt die beste IDE die es gibt. Da kommt .NET mit seiner IntelliSense nicht bei weitem ran.
Das einzig gute ist der DataSet-Designer und das man die DB über .NET verändern kann.
Gibt es für Java auch sowas Ähnliches? Hast Du eine Ahnung?
Nein, da kann ich dir leider nicht weiterhelfen, da ich mich mit .NET zu wenig auskenne.

Welche IDE benutzt Du denn?
Ich benutze auch Eclipse. Da Eclipse einem einfach schon unendlich viel Arbeit abnimmt.

Gruß

Fabio
 
Bei Eclipse brauchst du nicht zwangsweise jedes Package perfekt zu kennen. Besser is es zwar, aber muss nicht sein und ich würde fast behaupten, dass das eh keiner innerhalb einer IDE (zumindest nicht in Eclipse) von Hand runtertippt. Wenn du eine Klasse verwenden willst, die noch nicht importiert wurde, dann gibts mehrere Möglichkeiten diese durch Eclipse importieren zu lassen. Die einfachste und schnellste für die meisten ist wohl die Intellisence zu nutzen. Also einen oder mehr Buchstaben tippen und wenn du "langsam" genug bist, dann taucht die Intellisence auf, ansonsten Strg+Leertaste drücken und die richtige Klasse auswählen. Wurde sie noch nicht importiert, macht Eclipse das von selbst. Zusätzlich benutze ich noch zwei andere Wege, da ich meist zu schnell bin und die Intellisence nicht mitkommt. Die erste Möglichkeit ist der Shortcut Strg+Shift+o, dadurch werden alle Imports organisiert/verwaltet. Eclipse import dann alles was fehlt und das, was nicht benutzt wird, wird rausgeschmissen. Die zweite Möglichkeit ist eher zur Behebung von Fehlern gedacht, nämlich Strg+1. Dadurch werden dir verschiedene Lösungwege aufgezeigt, dazu gehört auch für den Fall den import hinzu zu fügen. Man kann damit aber auch andere Sachen machen, wie Methoden/Klassen/Interfaces deklarieren, falls sie fehlen (sehr praktisch, wenn du eine Methode verwenden willst, die noch nicht deklariert wurde, du aber bereits ihren Aufruf getippt hast). Gibt natürlich noch viel mehr nützlich Shortcuts, wie z.B. Shift+Alt+s, dadurch taucht ein Menü auf zum bearbeiten des Codes. Sehr nützlich sind da die Funktionen zum Erzeugen der Getter und Setter, delegate-Methoden oder auch die Möglichkeit Konstruktoren von Eclipse generieren zu lassen. Oder auch Shift+Alt+r zum Umbenennen von Methoden/Klassen/Variablen/etc., ist auch sehr praktisch.

Für die Datenbanksache gibt es für Eclipse das Plugin SQL Explorer. Hab ich noch nie benutzt, wird aber durch meine Ausbildung zwangsweise passieren. Kannst dir ja mal anschauen. Die Screenshots sehen jedenfalls sehr gut aus.

Ich muss aber dazu sagen, dass Eclipse nicht gleich Eclipse ist. Und zwar besteht Eclipse eigentlich nur aus einem Haufen von Plugins, wodurch man es sich nach seinen Bedürfnissen zusammenbauen kann. Auch die Programmiersprachen (Eclipse kann weit mehr als nur Java) sind entsprechende Plugins und jedes dieser Plugins hat sein eigenes Verhalten. Am weitesten und besten entwickelt (jedenfalls in meinen Augen) ist JDT, das Java Developlment Toolkit. Es ist sehr mächtig, einige der Shortcuts, die ich erklärt hab, nur mal als Beispiel. In anderen Plugins hat man meist nicht so viel Macht, z.B. PHP oder das von Adobe bereitgestellt Toolkit für Flex/Flash sind dagegen ein Witz. Also Eclipse ist nicht gleich Eclipse, es kommt drauf an, was man für Plugins verwendet.

Und Visual Studio ist auch eine sehr gute IDE, man muss nur mit ihr erstmal klar kommen, aber wenn das erstmal geschafft ist, dann ist das auch eine sehr gute und bequeme IDE, mit der man sehr schnell arbeiten und effektiv arbeiten kann. Ich weiß zwar nicht, wie es da bei VB.NET aussieht, aber mit C# hab ich damit nie Probleme gehabt, auch nicht mit der Intellisence.

Jede IDE hat ihre Macken und Unterschiede zu anderen, sonst würde es ja auch keinen Spaß machen. Aber VS und Eclipse haben sich ja nicht umsonst etabliert, beide sind super.

EDIT:
Ganz vergessen... Das wichtigste Shortcut überhaupt: Strg+s xD Aber zuvor lass ich noch immer den Formatter (Strg+Shift+f) und den Cleaner (Shift+Alt+s -> Cleanup (und wer mag, noch Sort members, hab ich aber bereits im Cleanup drin)) drüberjagen (beide muss man aber zuvor erst in den Einstellungen konfigurieren, außer du magst deren Standardverhalten). Mit F3 springt man zur Deklaration/Definition (z.B. wenn man mal schnell in ein Methode springen muss, aber kein Bock hat sie im ganzen Projekt zu suchen). Mit F2 wird die entsprechende Doku angezeigt (oder einfach Maus drüber schweben lassen).

Das wären eigentlich auch schon die wichtigsten... Was ich auch gerne ebnutze ist Strg+o. Ich habe zwar die Outline auch auf der rechten Seite, benutze sie aber nicht. Ab einer gewissen Größe ist in der Outline einfach zu viel und dann ist der Shortcut schneller, da man dort den Namen filtern kann. Mit Strg+7 Kommentiert man eine Zeile aus oder löscht den Kommentar (also nur die Kommentar-Slashes) (geht auch mit einem markierten Bereich und ist schneller als die Blockkommentare drumrum zu basteln, einfach markieren -> Strg+7 -> fertig). Was auch sehr interessant sein kann, ist zu wissen, wo eine Methode/Variable überall aufgerufen/verwendet wird. Einfach (wie meist) in den entsprechenden Namen klicken und Strg+Shift+G drücken, dann werden alle Aufrufe gesucht. So kann man auch schnell an die entsprechende Stelle springen. Mit Strg+G werden die Deklarationen gesucht, in wie fern das aber interessant sein kann, kann ich dir auch nicht sagen, da in den meisten Fällen man eh über F3 direkt hinspringt. Was auch sehr nützlich ist und du sicherlich auch öfter mal brauchen kannst, ist die Local History (Rechtsklick -> je nachdem ob nur vergleichen oder wiederherstellen willst, Compare with oder Replace -> Local History). Am besten du fügst dir irgendwo auch gleich das View dafür hinzu, dann hat mans gleich griffbereit.

Also wie man sieht, Eclipse nimmt einem echt jede Menge arbeit ab und das alles ist nur ein Bruchteil von dem, was das JDT alles kann (wie gesagt, ja nach Sprache ist der Umfang anders).
 
Zuletzt bearbeitet:
Hallo liebe Leute,

@Fabio
Danke für die Erklärungen. Wollte aber einen einzigen Node im Tree als Icon haben. Aber ich habe eine Lösung gefunden. Siehe unten.

@Akeshihiro
Ja, Eclipse ist echt cool. Meine Lieblingsshortcuts sind Alt+"Pfeil nach unten"....einfach schön zum verschieben.
Und...Strg + Alt + "Pfeil nach unten"...wenn man mal ein kleines Array anlegen will.
Den SQL-Explorer werde ich mir mal anschauen. Ich hoffe doch, dass er HSQLDB unterstützt.

So, jetzt zu meiner Lösung:
Habe einen Link gefunden, der mir weiterhalf. Allerdings füllte er die Icons mit Farben anstatt mit Icons.
Link: http://www.dreamincode.net/code/snippet1892.htm

Das habe ich jetzt mal abgeändert. Es sieht so aus:

Code:
    public class tree{
      .......
        ImageIcon icon = new ImageIcon("C:/Temp/folder.gif");
        MyNode branch2 = new MyNode("MyVersion Branch2", icon);
      ......
}

    class MyNode extends DefaultMutableTreeNode {
        
        private JLabel label;                // label which will contain Text and Icon
        MyNode(String text, ImageIcon icon) {
            label = new JLabel(text);
            // build an Icon with the Color passed as parameter
            label.setIcon(icon);
        }
        
        /** returns the label */
        JLabel getLabel() {
            return label;
        }
    }

Und schon klappt es. ;-)

Aber eine Frage hätte ich noch. Ich glaube mich daran erinnern zu können, dass man über eine Factory oder so etwas Ähnliches Zugriff auf die Icons die in Java implementiert sind zugreifen kann.
Habe vor mehrere Look&Feels zu unterstützen. Und es sieht deppert aus wenn der Metal-Ordner bei einem anderem L&F angezeigt wird.

Viele Grüße
Trigoor
 
Zuletzt bearbeitet:
Hi,
schön zu hören, dass du noch eine Lösung gefunden hast. Zu deiner Frage wegen dem L&F, habe ich hier einen Link gefunden (UIManager), den du dir mal ansehen solltest. Über diesen UIManager kannst du die Default-Icons (und vieles mehr) des L&F laden, wenn ich das richtig verstanden habe. Habe damit aber selber noch nichts gemacht muss ich zugeben.
Auf dieser Seite kannst du noch alle Defaults einsehen. (sind ein paar mehr) ;)

Gruß

Fabio
 
Also der SQL-Explorer scheint cool zu sein. Und da er ODBC (ist ja eigentlich klar) unterstützt, dürfte er mit HSQLDB zurecht kommen. :)

Das mit dem UIManager werde ich mal ausprobieren. Denke, dass ich das hinkriege.

Gruß
Trigoor
 
Zurück