JTree - Was mach ich falsch?

Nobody23

Grünschnabel
Guten Tag

Angeregt aus folgendem Thema,
habe ich mich daran versucht selber einen "Tree" zu programmieren.
Als ich ihn aber startete(extra Klasse, welche von JFrame erbt) kam kein "Tree" sondern ein leeres Fenster(siehe Anhang).

Daher frage ich mich welche Komponenten ich vergessen habe zu initialisieren oder falsch verwendet habe, da ich nur einen kleinen Erfahrungswert in Sachen Swing habe.

Mein Code:

Code:
package gui;

import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import filehandling.Reader;	//Eigene Klasse

public class Explorer extends JScrollPane implements TreeSelectionListener,
		MouseListener {

	private JTree theTree = new JTree(new DefaultMutableTreeNode());

	private String filePath;

	private String fileName;

	private String fileType;

	private String path;

	public Explorer() {
		theTree.addTreeSelectionListener(this);
		theTree.addMouseListener(this);
		theTree.setEditable(false);
		theTree.setDragEnabled(true);
		theTree.makeVisible(new TreePath("C:/"));
		this.add(theTree);
		this.setSize(300, 500);
		this.setVisible(true);
	}

Vielen Dank im Voraus

Gruss
 

Anhänge

  • Fenster.jpg
    Fenster.jpg
    6,7 KB · Aufrufe: 40
Ich habs gerade mal ausprobiert. Es funktioniert wenn du die Zeile

Code:
this.add(theTree);

durch

Code:
this.setViewportView(theTree);

ersetzt. Dann wird der Tree angezeigt. Wenn man allerdings nur deinen Codeausschnitt hat, ist er natürlich noch völlig leer :)
 
Kann das mir jemand genauer erklären wie ein JTree aufzubauen ist, so das er etwa dem "Windows-Explorer"(Treeframe) ähnlich ist?

Danke
Gruss
 
Naja, ein JTree ist halt ein Baum - wie der Name schon sagt. Das reicht eigentlich schon als Erklärung :)

Also es gibt ja zum Beispiel diese DefaultMutableTreeNode. Davon braucht man eine als Wurzel (Root). Wie oben im Quelltext zu sehen ist kann man damit den JTree direkt initialisieren, auch wenn es wohl wenig Sinn macht da keinen Text hinter zu setzen. Hier käme zum Beispiel "C:\" oder "Arbeitsplatz" rein, je nachdem wo man anfangen will.
Für jedes Verzeichnis braucht man dann eine neue DefaultMutableTreeNode("verzeichnisname"), die einfach mit root.add(node) an die Wurzel gehangen wird. An diese Knoten können dann wiederum mit add weitere Unterverzeichnisse oder die Dateien gehangen werden.

Am besten ergoogelst du dir ein Beispiel, das du nachvollziehen kannst. Ich bin da gerade beim Suchen z.B. auf http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JTree.html gestoßen, was eigentlich schon ganz gut aussieht :) (aber wohl ein bisschen weiter geht *g*)


Hmm ... ich seh gerade, es geht wohl auch noch ein Stück einfacher (wenn wir Tom nicht hätten *g*) - schau mal bei http://www.tutorials.de/forum/java/227750-jtree-mit-verzeichnissen-fuellen.html
 
Danke, es nähert sich dem was ich will.
Aber:
1. Ich wills selbst können, nich einfach CTRL+C, +V, jedoch fehlt mir das Verständnis von JTree und den nötigen Komponenten(DefaultMutableTreeNode usw.).
2. Das Beispiel und sein Erstellter in allen Ehren(t ja auch) jedoch kann jemand wie ich (relativ begrenzten Erfahrung) bei einer so "kompakten"/fortgeschrittenen Schreibweise und keinen Kommentaren einfach dem Code nur schwerlich folgen.

Code:
package gui;

import java.awt.event.*;
import java.io.File;

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

import filehandling.Reader; //Eigene Klasse


/**
 * @author nmeyer
 * 
 */
public class Explorer extends JScrollPane implements TreeSelectionListener,
		MouseListener {

	private JTree theTree = new JTree(new DefaultMutableTreeNode());

	private String theFilePath;

	private String theFileName;

	private String theFileType;

	private TreePath thePath;

	private Reader theReader;

	public Explorer(Reader pTheReader) {
		theReader = pTheReader;
		theTree.addTreeSelectionListener(this);
		theTree.addMouseListener(this);
		theTree.setEditable(false);
		theTree.setDragEnabled(false);
		theTree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode(
				new File("C:/"))));
		this.setViewportView(theTree);
		this.setSize(300, 500);
		this.setVisible(true);

	}

	private void changePathData() {
		/*
		 * if(path != null) { fileName = this.extractFileNameOutOfPath();
		 * fileType = this.extractFileTypeOutOfPath(); }
		 */
	}

	private String extractFileNameOutOfPath() {
		// TODO Auto-generated method stub
		return null;
	}

	private String extractFileTypeOutOfPath() {
		/*
		 * int index = path.length(); String theFileType = ""; while
		 * (path.charAt(index) != '.' && index >= 0) { index--; } while (index <=
		 * path.length()) {
		 * theFileType.concat(String.valueOf(path.charAt(index))); index++; }
		 * return theFileType;
		 */
		return null;
	}

	public void valueChanged(TreeSelectionEvent e) {
		thePath = e.getPath();
		this.changePathData();
	}

	private boolean areFileDataNotNull() {
		return theFilePath != "" && theFileName != "" && theFileType != "";
	}
	
	
	public void mouseClicked(MouseEvent e) {
		if (e.getButton() == MouseEvent.BUTTON1) {
			int clickCounter = e.getClickCount();
			if (clickCounter >= 2 && areFileDataNotNull()) {
				Reader theReader = new Reader();
				if (theFileType == ".emf") {
					theReader.read(theFilePath, theFileName);
				} else {
					theReader.readExternal(theFilePath, theFileName,
							theFileType);
				}
			}
		}
	}

	public void mouseEntered(MouseEvent e) {
	
	}

	public void mouseExited(MouseEvent e) {
		
	}

	public void mousePressed(MouseEvent e) {
		
	}

	public void mouseReleased(MouseEvent e) {
		
	}

	public String getFileName() {
		return theFileName;
	}

	public void setFileName(String fileName) {
		this.theFileName = fileName;
	}

	public String getFilePath() {
		return theFilePath;
	}

	public void setFilePath(String filePath) {
		this.theFilePath = filePath;
	}

	public String getFileType() {
		return theFileType;
	}

	public void setFileType(String fileType) {
		this.theFileType = fileType;
	}
}

Was muss ich an meiner Klasse ändern/erweitern, dass sie mir den Inhalt der Systemlaufwerke anzeigt?
Also alle Festplatten/Partitionen und Datenträgerlaufwerke (Disketten/CD/DVD), wies halt der Windowsexplorer.

Falls jemand generelle Verbesserungenmöglichkeiten(oder Fehler) sieht, dann nehme ich das gerne entgegen.

Zusätzlich Frage:
Wie bekommt man aus dem Path einen ganzen String?

Gruss und Dank
 
Hallo
Habe jetzt meinen JTree so hinbekommen, dass er mir alle den Arbeitsplatz und deren Laufwerke(und deren Inhalt) anzeigt, jedoch werden der Arbeitsplatz und die Laufwerke nicht richtig benannt.

Code:
/**
 * 
 * @author NMeyer
 *
 */
public class ExplorerStructure {
	
	private JTree theTree;
	
	
	public ExplorerStructure() {
		theTree = new JTree();
		File theTop = FileSystemView.getFileSystemView().getParentDirectory(new File("C:/"));
		buildTreeModel(theTop, theTree);
		
	}
	
	   class DeviceTreeNode extends DefaultMutableTreeNode {
		   
		   //zweiter
	        public DeviceTreeNode(File file) {
	            setUserObject(file);
	        }

	        public int getChildCount() {
	            return getFileList((File) getUserObject()).size();
	        }

	        public TreeNode getChildAt(int index) {
	            return new DeviceTreeNode((File) getFileList(
	                    (File) getUserObject()).get(index));
	        }

	        public boolean isLeaf() {
	            return !((File) getUserObject()).isDirectory();
	        }

	        public String toString() {
	            return ((File) getUserObject()).getName();
	        }

	        private List getFileList(File file) {
	            List fileList = new ArrayList();
	            File[] files = file.listFiles();
	            for (int i = 0; i < files.length; i++) {
	                    fileList.add(files[i]);
	            }
	            return fileList;
	        }
	    }
    
    //Erster
    void buildTreeModel(File file, JTree tree) {
    	DeviceTreeNode theFSTN = new DeviceTreeNode(file);
    	DefaultTreeModel theDTM = new DefaultTreeModel(theFSTN);
        tree.setModel(theDTM);
    }
    
    
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ExplorerStructure theStruct = new ExplorerStructure();
	}

	public JTree getTheTree() {
		return theTree;
	}

}

Was muss ich ändern, damit das korrekt benannt wird?
 

Anhänge

  • Explorer.JPG
    Explorer.JPG
    13,3 KB · Aufrufe: 91
Zurück