Swing JTree expandierte Pfade ermitteln

  • Themenstarter Themenstarter SlaterB
  • Beginndatum Beginndatum
S

SlaterB

Gast
Hallo,

mit JTree.getSelectionPaths() bekommte ich Pfade zu allen aktuell selektierten Elementen,
nun möchte ich die Nodes komplett austauschen, wobei der Baum weitgehend gleich bleibt
(stellt Dateisystem dar, paar neue Dateien kommen dazu/ paar alte werden gelöscht),

dabei werden alle Nodes zusammengeklappt, ich möchte dagegen ungefähr das vorherige Bild wieder herstellen,
gibt es eine einfache Möglichkeit, zumindest erstmal den Status vor dem Löschen zu merken, wie JTree.getExpandedPaths(), welche ich nicht finde,
oder muss man die Nodes abklappern/ mit Listener arbeiten, hat schon jemand fertigen Code in diese Richtung?

alternativ überlege ich auch, die Knoten beizubehalten, nur dort zu entfernen/ zu erweitern, wo es auch Änderungen gab,
dazu sind Kommentare/ Code auch gern gesehen 😉
 
ich will komplett neu setzen,
beim Dateisystem bietet sich ja auch dynamisches Nachladen, nur einen Node fürs Grundverzeichnis und erst wenn der wieder aufgeklappt wird, schaut das Programm im Dateisystem nach was aktuell vorhanden ist,
insofern wird es eher aufwendiger, den ganzen Baum zu durchlaufen und in allen Verzeichnissen mit dem Dateisystem zu vergleichen

die Methode ist sicherlich eine Alternative, mit bisschen Rekursion kann man daraus Pfade zusammenstellen bzw. mir reichen vielleicht auch die Nodes an sich
 
Du willst also, dass wenn sich während der Laufzeit etwas im Dateisystem ändernt, der Inhalt eines Astes beim nächsten Aufklappen aktualisiert wird?

Vielleicht kannst Du ja darauf aufbauen:
Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.io.File;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.ExpandVetoException;

public class DynamicExplorerReload extends JFrame {
	private JTree tree;
	private DefaultTreeModel model;
	private FileNode rootNode;

	public DynamicExplorerReload() {
		File file = new File("C:\\");
		rootNode = new FileNode(file);
		tree = new JTree(model = new DefaultTreeModel(rootNode));
		this.loadChildren(rootNode);
		this.getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
		tree.expandRow(0);
		
		tree.addTreeWillExpandListener(new TreeWillExpandListener(){
			public void treeWillCollapse(TreeExpansionEvent evt) throws ExpandVetoException {
			}

			public void treeWillExpand(TreeExpansionEvent evt)	throws ExpandVetoException {
				loadChildren((FileNode)evt.getPath().getLastPathComponent());
			}
		});
		
		tree.setCellRenderer(new DefaultTreeCellRenderer(){
			public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel,
						boolean expanded, boolean leaf, int row, boolean hasFocus) {
				super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
				FileNode node = (FileNode)value;
				if (node.getFile()==null) {
					this.setText(" ist leer ");
					this.setIcon(null);
				}
				else
					this.setText(node.getFileName());
				return this;
			}
		});
	}

	private void loadChildren(FileNode node) {
		File[] files = node.getFile().listFiles();
		FileNode parent = (FileNode)node.getParent();
		node.removeAllChildren();
		model.reload();
		
		for (int i = 0; i < files.length; i++) {
			FileNode child = new FileNode(files[i]);
			model.insertNodeInto(child, node, node.getChildCount());
			if (files[i].isDirectory()) 
				model.insertNodeInto(new FileNode(null), child, child.getChildCount());
		}
		if (node.getChildCount()==0)
			model.insertNodeInto(new FileNode(null), node, node.getChildCount());
		tree.repaint();
		this.validate();
	}

	class FileNode extends DefaultMutableTreeNode {
		private File file;
		
		public FileNode(File file) {
			super(file);
			this.file = file;
		}
		
		public File getFile() {
			return file;
		}

		public String getFileName() {
			return file.getName();
		}
	}

	public static void main(String[] args) {
		JFrame frame = new DynamicExplorerReload();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 
den Grundcode eines solchen JTrees habe ich schon, nach
Showing the file system as a Swing JTree Pushing Pixels
bzw. modifiziert, aber danke

mir gehts jetzt wirklich nur um Merken der expandierten Pfade + Neusetzen später, ganz unabhängig vom Inhalt

> dass wenn sich während der Laufzeit etwas im Dateisystem ändernt, der Inhalt eines Astes beim nächsten Aufklappen aktualisiert wird?

och nöh, während der User ständig rumklickt soll lieber nix passieren (edit: bis auf initiales Laden bei erstmaligen Öffnen),
das Update passiert genau bei einem Button-Klick bzw. nach internen Aktionen die etwa neue Dateien ablegen
und dann soll eben die Anzeige aktueller werden, gerade der Äste, die schon offen sind,
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben