JTree mit Ordneransicht in JPanel einbinden

blade_mz

Mitglied
Moin,

ich schreibe an einem Programm bei dem eine Ordneransicht zum einen als JTable und zum anderen als JTree angezeigt werden soll. Zum Teil funktioniert das auch mit meinem Quellcode. Aber nur manchmal.

Es ist möglich den Inhalt kleinerer Ordner (6 Dateien) darzustellen. Wenn die Ordner aber mehrere 100 Dateien beinhalten bekomme ich keine Anzeige.

Manchmal wird aber auch der kleine Ordner - der sonst angezeigt wird - nicht angezeigt. Manchmal wird zusätzlich nicht das "toplabel" angezeigt.

Irgendwie überlistet mich mein Code und ich komme das ganze Wochenende schon nicht dahinter, warum und wieso.

Ich hoffe, von euch kann mir jemand helfen.

Java:
public class init {

	public static void main(String[] args) {

		new Gui();

	}

}

Java:
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.SwingConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.event.*;
import java.io.File;



public class Gui extends JFrame implements ActionListener{
	
//Variablen deklarieren
	JLabel topLabel;
	JMenuBar jmb;
	JMenu datei;
	JMenuItem beenden;
	JMenuItem einstellungen;
	JMenu hilfe;
	JMenuItem about;
	JPanel centerPanel;
	JTable tableThisPC;
	JTree tree;
	String [][] data;
	String verzeichnis;
	
	public Gui(){
		super("Test Test Test");
				
		tree = new JTree(addNodes());
		
		this.setSize(800,500);
		this.setLocation(100,100);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        getContentPane().setLayout(new BorderLayout(5,5));
        
        
        //Menüleiste erzeugen
		jmb = new JMenuBar();
		datei = new JMenu("Datei");
		hilfe = new JMenu("Hilfe");
        beenden = new JMenuItem("Beenden");
        beenden.addActionListener(this);
        einstellungen = new JMenuItem("Einstellungen");
        einstellungen.addActionListener(this);
        about = new JMenuItem("Über");
        about.addActionListener(this);
        jmb.add(datei);
        jmb.add(hilfe);
        datei.add(einstellungen);
        datei.add(beenden);
        hilfe.add(about);
        this.setJMenuBar(jmb);
        
        // NORTH Dialog erzeugen
        topLabel = new JLabel("Test Test Test");
		topLabel.setFont(new Font("Monospaced",Font.BOLD,38));
		topLabel.setHorizontalAlignment(SwingConstants.CENTER);
		this.add(topLabel, BorderLayout.NORTH);		
		
		// CENTER Dialog erzeugen
		centerPanel = new JPanel();
		centerPanel.setLayout(new BorderLayout(5,5));	
		verzeichnis = "C:\\Temp2";
		OrdnerSearch x = new OrdnerSearch(verzeichnis);
		data = x.getOrdnerListe();
		String [] headline = {"Nummer","Datei"};
		tableThisPC = new JTable(data, headline);
		centerPanel.add(new JScrollPane(tableThisPC), BorderLayout.WEST);	
				
		FolderView fv = new FolderView(new File(verzeichnis));
		JPanel testtree = fv.getPanel();
		centerPanel.add(testtree, BorderLayout.EAST);

		this.add(centerPanel, BorderLayout.CENTER);
	}	

	public DefaultMutableTreeNode addNodes(){
		
		String[] datata = {"1","2"};
		
		DefaultMutableTreeNode n = new DefaultMutableTreeNode(datata[0]);
		n.add(new DefaultMutableTreeNode(datata[1]));
		
		return n;
	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource() == einstellungen)
		{
			
		}
		if(e.getSource() == beenden)
		{
			System.out.println("Programm wird beendet");
			System.exit(0);
		}
		if(e.getSource() == about)
		{
			
		}
		
	}
}

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;

public class FolderView  
{ 
	
	private JPanel hilfspanel = new JPanel();
	JScrollPane scrollpane;
	JTree tree;

    public FolderView(File dir) {
        hilfspanel.setLayout(new BorderLayout(5,5));

        // Make a tree list with all the nodes, and make it a JTree
        tree = new JTree(addNodes(null, dir));
        

        // Add a listener
        tree.addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode node =
                    (DefaultMutableTreeNode)e.getPath().getLastPathComponent();
                System.out.println("You selected " + node);
            }
        });

        // Lastly, put the JTree into a JScrollPane.
        scrollpane = new JScrollPane();
        scrollpane.getViewport().add(tree);
        hilfspanel.add(scrollpane, BorderLayout.CENTER);
    }

    /** Add nodes from under "dir" into curTop. Highly recursive. */
    public DefaultMutableTreeNode addNodes(DefaultMutableTreeNode curTop, File dir) {
        String curPath = dir.getPath();
        DefaultMutableTreeNode curDir = new DefaultMutableTreeNode(curPath);
        if (curTop != null) {   // should only be null at root
            curTop.add(curDir);
        }
        Vector ol = new Vector();
        String[] tmp = dir.list();
        for (int i=0; i<tmp.length; i++)
            ol.addElement(tmp[i]);
        Collections.sort(ol, String.CASE_INSENSITIVE_ORDER);
        File f;
        Vector files = new Vector();
        // Make two passes, one for Dirs and one for Files. This is #1.
        for (int i=0; i<ol.size(); i++) {
            String thisObject = (String)ol.elementAt(i);
            String newPath;
            if (curPath.equals("."))
                newPath = thisObject;
            else
                newPath = curPath + File.separator + thisObject;
            if ((f = new File(newPath)).isDirectory())
                addNodes(curDir,  f);
            else
                files.addElement(thisObject);
        }
        // Pass two: for files.
        for (int fnum=0; fnum<files.size(); fnum++)
            curDir.add(new DefaultMutableTreeNode(files.elementAt(fnum)));
        return curDir;
    }
    
    public JPanel getPanel(){
    	return hilfspanel;
    }
}

Java:
import java.io.File;
import java.util.ArrayList;

public class OrdnerSearch {
	String Ordner;
	File f;
	File[] fileArray;
	ArrayList<String []> liste= new ArrayList<String[]>();
	
	public OrdnerSearch(String o){
		this.Ordner = o;
		f = new File(o);
		listDir(f);
	}
	
	public void listDir(File dir) {
		File[] files = dir.listFiles();
		if (files != null) {
			for (int i = 0; i < files.length; i++) {
				String[] eintrag = {Integer.toString(i), files[i].toString()};
				liste.add(i,eintrag);
			}
		}
	}
	
	public String[][] getOrdnerListe(){
		String[][] o = new String[liste.size()][2];
		for(int i = 0; i<liste.size();i++){
			String[] listenwert = liste.get(i);
			o[i][0] = listenwert[0];
			o[i][1] = listenwert[1];
		}
		return o;
	}
}

Achja, ein paar Informationen habe ich vergessen:

- die Klasse FolderView habe ich hierher. Klick Der Rest ist auf meinem Mist gewachsen.

- die Variable tree und die Methode addNodes sind in meinen Augen nutzlos. Wenn ich sie aber lösche, bekomme ich keine Anzeige mehr.

- Ich nutze Eclipse als IDE

- Ich bin ein Java-Anfänger mit sehr wenig Erfahrung also bitte zerreisst mich nicht in der Luft
 

KrokoDiehl

Top Contributor
Hallo.
Ich sehe erstmal keine offensichtlichen Fehler, daher die Frage ob irgendwelche Ausnahmen auftreten (mal Eclipse-Konsole anschauen)? Falls nicht dann hilft wohl erstmal nur Debugging und/oder Testausgaben um der Ursache auf die Spur zu kommen.
Vielleicht auch ein Neu-Implementieren einzelner Teile - z.B. des JTrees - zum Üben/Testen.

Was mir aufgefallen ist, ist dass
Code:
addNodes()
-Methode "gefährlich" ist. Sie arbeitet rekursiv und wenn man hier große Verzeichnisse trifft, kann es sicher schnell zum Speicherfresser werden wenn in dem JTree viele Knoten eingefügt werden.
Andererseits ist eine lazy-Lösung (Baum erst dann erweitern, wenn man ein Verzeichnis-Knoten öffnet) auch komplexer.
Daraus folgend kann ich dir sagen, dass die Methode
Code:
FolderView.addNodes(
) sehr wichtig ist, weil sie nämlich erst die Daten (Knoten) in deinen JTree anfügt. Ohne diese ist er natürlich leer.

[EDIT]
Ah - ich denke ich habe doch das offentliche Problem erkannt: Bereits im Konstruktor von Gui:
Du rufst
Code:
setVisible(true)
früh auf, bevor überhaupt das Layout feststeht. Damit bekommt deine GUI noch nicht alle Änderungen mit. Verschiebe also die Aufrufe wie
Code:
pack()
und
Code:
setVisible(true)
ans Ende des Konstruktors, bzw. nachdem das Layouting getan wurde und alle Daten geladen sind.

Ansonsten sieht der Code schon nach "hauptsache es klappt" aus. Ein paar Swing-Tutorials wären ein guter nächster Schritt. :)
[/EDIT]
 
Zuletzt bearbeitet:

blade_mz

Mitglied
Das wars!! DANKE!! Zwei Tage Arbeit wegen sowas :oops:

Kannst du mir da ein paar Tutorials empfehlen? Ich hab schon jede Menge gegoogelt und auch einige gefunden, aber ich bin mittlerweile über den Status "Totaler Anfäger" hinweg (dafür gibt es viele Tutorials) aber noch lange nicht ein Profi (auch hierfür habe ich ab und zu etwas gefunden).

Was ich suche ist ein Tutorial, in dem erklärt wird wie man "anständig" programmiert. Und zwar nicht nur einen JFrame mit einem JLabel und einem JButton, bei dem sich die Farbe des Buttons ändert, wenn man drauf drückt... sondern schon etwas komplexer...
 
Ä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
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
L Swing [JTree] Selektierte Nodes nummerieren AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben