JTree Datei Icons ?

Status
Nicht offen für weitere Antworten.
S

Steffan

Gast
Ich hab einen JTree jedoch zeigt er mir nur bei Verzeichnissen ein Icon vor den Namen an. Bei Daten ist nur so ein Kreis. Es Gab doch eine Klasse/Methode die automatisch vor jede Datei das richtige icon setzt (txt, zip, ....).

Hier noch mein TreeModel Code.
Code:
class FileTreeModel
	  implements TreeModel {

	protected myFile root; // Wurzel
	
	
	public void erneuerTree(){
		
	}
	
	public FileTreeModel(myFile root) {
	  this.root = root;
	}

	public void setroot(myFile pathnamer) {
	  this.root = pathnamer;
	}

	public Object getRoot() {
	  return root;
	} // Liefert die Wurzel des Funktionsbaumes

	public boolean isLeaf(Object node) {
	  return ( (myFile) node).isFile();
	} // ist es ein Blatt oder nicht

	private Vector listeners = new Vector();

	public int getChildCount(Object parent) { //bekommt object Eltern und soll Anzahl Kind-Knoten dieses Knotens liefern
	  String[] children = ( (myFile) parent).list(); //gibt String Liste von parent
	  if (children == null)return 0; //wenn keine children dann 0
	  return children.length; // sonst Länge der Kinder zurückgeben
	}

	public Object getChild(Object parent, int index) { // bekommt parent und Index des gesuchten Kind-Knotens und liefert Object Kind-Knoten
	  String[] children = ( (myFile) parent).list(); //gibt String Liste von parent
	  if ( (children == null) || (index >= children.length))return null;
	  return new myFile( (myFile) parent, children[index]);
	}

	public int getIndexOfChild(Object parent, Object child) { //bekommt parent und object Kind
	  String[] children = ( (myFile) parent).list();
	  if (children == null)return -1; //wenn kinder 0 dann ende -1
	  String childname = ( (myFile) child).getName(); //String name des Kindes ist
	  //childname = childname.substring(0,6);
	  for (int i = 0; i > children.length; i++) {
		if (childname.equals(children[i]))return i;
	  }
	  return -1;
	}

	public void valueForPathChanged(TreePath path, Object newvalue) {} // Wird aufgerufen, wenn der Wert für den Pfad geändert wurde.

	public void addTreeModelListener(TreeModelListener l) {
	  listeners.add(l);
	} 

	public void removeTreeModelListener(TreeModelListener l) {} // Entfernt den Listener        

  }

und so wird mein JTree erzeugt
Code:
myFile root = new myFile(System.getProperty("file.separator"));
final FileTreeModel model = new FileTreeModel(root);
jTree = new javax.swing.JTree(model);
 
B

Beni

Gast
Stimmt, die gab es: javax.swing.filechooser.FileSystemView.getSystemIcon( File file );

Allerdings musst Du noch einen eigenen TreeCellRenderer implementieren. Schau die den DefaultTreeCellRenderer an, den kannst du recht einfach erweitern.
 
S

steffan

Gast
Also ich muss erst eine neue Klasse erstellen die DefaultTreeCellRenderer erweitert:

Code:
class Renderer extends DefaultTreeCellRenderer{

dann fehlt ja noch mein Konstruktor:
Code:
private FileSystemView system;

    public Renderer(){
      system = FileSystemView.getFileSystemView();
    }

was fehlt da jetzt noch?

muss ich dann die Instanz der Klasse im TreeModel aufrufen und dann mein File übergeben was ich im TreeModel erhalte?

Code:
setIcon( system.getSystemIcon( file ) );
 
B

Beni

Gast
Den Renderer übergibst du dem JTree. JTree.setCellRenderer. Danach wird der JTree die Methode getTreeCellRendererComponent aufrufen, die du noch erweitern musst:

Code:
public class Renderer extends DefaultTreeCellRenderer{
  public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){
    super.getTreeCellRendererComponent( tree, value, selected, expanded, leaf, row, hasFocus );

    setIcon( // Das Icon das zu value gehört );

    return this;
  }
}
 
S

steffan

Gast
Das bedeutet doch aber das ich bei setIcon vorgeben muss für welche Datein er ein Icon setzten soll oder? Kann ich nicht einfach angeben das er für alle Datein Icons setzten soll egal wechle Endung sie haben?

Und im HauptProgramm müßte doch dann der Aufruf so sein:
Code:
tree.setCellRenderer(new Renderer());
 
B

Beni

Gast
Der Aufruf muss da sein, ja.

Also: der JTree kann nicht alles. Er bietet eine Grundkonstruktion, die du mit "Plugins" erweitern musst.
Die Plugins musst du selber schreiben.

In deinem Fall ist value ein myFile, zusammen mit meiner ersten Antwort sollte es dir doch möglich sein, das Icon (passend zum Dateityp) innert einer Zeile herauszufinden!

mfg Beni
 
G

Guest

Gast
Könnte ich das so aufbauen? Jedoch gibs in der Klasse File eine Methode die meine Endung vergleicht?

Code:
public class Renderer extends DefaultTreeCellRenderer{ 
	public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){ 
	  super.getTreeCellRendererComponent( tree, value, selected, expanded, leaf, row, hasFocus ); 
	  myFile f = (myFile)value;
	  if (bestimmte Eigenschaften von f){
	  	 this.setIcon(new ImageIcon("wasmanwill.jpg|gif|png(?)")); 
	  }
	  return this; 
	} 
  }
 
B

Beni

Gast
Ich kenne keine Vergleichsmethode, muss man wohl selber schreiben.

Aber ein Tipp: speichere die Images, wenn du sie jedesmal neu lädts ( new... ) wird dein Progi sehr langsam.
 

Craven

Aktives Mitglied
Hallo Leute!
Also ich habe auch genau dieses Problem! Folgenden Vorschlag hab ich gefunden:

Code:
public class FileTreeCellRenderer extends JLabel
                                                implements TreeCellRenderer 
{
  public Component getTreeCellRenderer Component ( JTree tree, Object value, [und Zeugs] ) {
    File f = (File)value;
    this.setText(f.getName());
    if ( bestimmte Eigenschaft von f ) {
      this.setIcon(new ImageIcon("....jpg|gif|png"));
    }
    return this;
  }
}


im Hauptprogramm:

Code:
JTree tree = new JTree();
tree.setCellRenderer( new FileTreeCellRenderer() );

Das Problem dabei ist, daß egal was ich probiert habe, das Teil funktioniert nicht. Vielleicht kann sich jemand die Mühe machen und ein komplettes Beispiel stricken?! Das wär echt toll!

Gruß
Craven
 
S

steffan

Gast
Ja genau das gleiche hab ich auch gefunden.

ich verstehe auch nicht was ich da reinschreiben muss?
Code:
ImageIcon(""));

kann man denn das so schreiben dann?
Code:
ImageIcon("jpg|gif")
 
B

Beni

Gast
Woher auch immer ihr dieses Beispiel habt, es ist schlecht.

1. Schaut doch mal hier nach, was ImageIcon für ein Argument benötigt. Ein korrekter Pfad zu einer existierenden Datei.

2. Speichert die ImageIcons irgendwo ausserhalb der Methode. Mit tausenden new ImageIcon verschwendet ihr soviel Ressourcen...

Eine Hashtable bietet sich an:
Code:
Hashtable icons = new Hashtable();

// so füllen
icons.put( "txt", new ImageIcon( "data/txt_icon.png" ) );

// so lesen
Icon icon = (Icon)icons.get( "txt" );
 
S

steffan

Gast
Ach so man muss das Icon Symbol selber haben? Ich dachte Java hat die Icon Symbole schon.
 

Craven

Aktives Mitglied
Das mit

Code:
ImageIcon("jpg|gif");

funktioniert so selbstverstänlich nicht! Der "|" steht für "oder"!

Und daß man die einzelnen Icons erzeugen muß ist denk ich mal auch klar!

Allerdings, wie läßt sich das alles zusammenfügen?!

Vielleicht kann jemand ein komplettes Beispiel posten.

Gruß
Craven
 
B

Beni

Gast
Dass ich mich mal selber zitieren muss, hätte ich nicht gedacht :D

Beni hat gesagt.:
Stimmt, die gab es: javax.swing.filechooser.FileSystemView.getSystemIcon( File file );

Allerdings musst Du noch einen eigenen TreeCellRenderer implementieren. Schau die den DefaultTreeCellRenderer an, den kannst du recht einfach erweitern.

Beni hat gesagt.:
In deinem Fall ist value ein myFile, zusammen mit meiner ersten Antwort sollte es dir doch möglich sein, das Icon (passend zum Dateityp) innert einer Zeile herauszufinden!

steffan hat gesagt.:
Ach so man muss das Icon Symbol selber haben? Ich dachte Java hat die Icon Symbole schon.

Nur genauer lesen :wink:
Das mit dem ImageIcon kommt von dem (deinem?) Vorschlag: "Könnte ich das auch so aufbauen...". Da bin ich umgeschwenkt.

mfg Beni
 

Craven

Aktives Mitglied
Ich glaub, ich hab ein komplettes Beispiel gefunden! Hab aber keine Bilder hier!

Kann das Beispiel mal jemand ausprobieren und das Ergebnis posten?!

Code:
// Imports
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;

class RenderTreeExample
		extends 	JFrame
 {
	// Instance attributes used in this example
	private	JPanel		topPanel;
	private	JTree		tree;
	private	JScrollPane scrollPane;

	// Constructor of main frame
	public RenderTreeExample()
	{
		// Set the frame characteristics
		setTitle( "Custom Rendered Tree Application" );
		setSize( 300, 200 );
		setBackground( Color.gray );

		// Create a panel to hold all other components
		topPanel = new JPanel();
		topPanel.setLayout( new BorderLayout() );
		getContentPane().add( topPanel );

		// Create data for the tree
		DefaultMutableTreeNode root
					= new DefaultMutableTreeNode( "Deck" );

		DefaultMutableTreeNode itemClubs
					= new DefaultMutableTreeNode( "Clubs" );
		addAllCard( itemClubs );
		root.add( itemClubs );

		DefaultMutableTreeNode itemDiamonds
					= new DefaultMutableTreeNode( "Diamonds" );
		addAllCard( itemDiamonds );
		root.add( itemDiamonds );

		DefaultMutableTreeNode itemSpades
					= new DefaultMutableTreeNode( "Spades" );
		addAllCard( itemSpades );
		root.add( itemSpades );

		DefaultMutableTreeNode itemHearts
					= new DefaultMutableTreeNode( "Hearts" );
		addAllCard( itemHearts );
		root.add( itemHearts );

		// Create a new tree control
		DefaultTreeModel treeModel = new DefaultTreeModel( root );
		tree = new JTree( treeModel );

        // Tell the tree it is being rendered by our application
        tree.setCellRenderer( new CustomCellRenderer() );

		// Add the listbox to a scrolling pane
		scrollPane = new JScrollPane();
		scrollPane.getViewport().add( tree );
		topPanel.add( scrollPane, BorderLayout.CENTER );
	}

	// Helper method to write an enitre suit of cards to the
	// current tree node
	public void addAllCard( DefaultMutableTreeNode suit )
	{
		suit.add( new DefaultMutableTreeNode( "Ace" ) );
		suit.add( new DefaultMutableTreeNode( "Two" ) );
		suit.add( new DefaultMutableTreeNode( "Three" ) );
		suit.add( new DefaultMutableTreeNode( "Four" ) );
		suit.add( new DefaultMutableTreeNode( "Five" ) );
		suit.add( new DefaultMutableTreeNode( "Six" ) );
		suit.add( new DefaultMutableTreeNode( "Seven" ) );
		suit.add( new DefaultMutableTreeNode( "Eight" ) );
		suit.add( new DefaultMutableTreeNode( "Nine" ) );
		suit.add( new DefaultMutableTreeNode( "Ten" ) );
		suit.add( new DefaultMutableTreeNode( "Jack" ) );
		suit.add( new DefaultMutableTreeNode( "Queen" ) );
		suit.add( new DefaultMutableTreeNode( "King" ) );
	}

	// Main entry point for this example
	public static void main( String args[] )
	{
		// Create an instance of the test application
		RenderTreeExample mainFrame	= new RenderTreeExample();
		mainFrame.setVisible( true );
	}
}

The code listing for CustomCellRenderer.java is: 


// Imports
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;

public class CustomCellRenderer
		extends		JLabel
		implements	TreeCellRenderer
{
   private ImageIcon		deckImage;
   private ImageIcon[]		suitImages;
   private ImageIcon[]		cardImages;
	private boolean			bSelected;


	public CustomCellRenderer()
	{
		// Load the images
		deckImage = new ImageIcon( "deck.gif" );

		suitImages = new ImageIcon[4];
		suitImages[0] = new ImageIcon( "clubs.gif" );
		suitImages[1] = new ImageIcon( "diamonds.gif" );
		suitImages[2] = new ImageIcon( "spades.gif" );
		suitImages[3] = new ImageIcon( "hearts.gif" );

		cardImages = new ImageIcon[13];
		cardImages[0] = new ImageIcon( "ace.gif" );
		cardImages[1] = new ImageIcon( "two.gif" );
		cardImages[2] = new ImageIcon( "three.gif" );
		cardImages[3] = new ImageIcon( "four.gif" );
		cardImages[4] = new ImageIcon( "five.gif" );
		cardImages[5] = new ImageIcon( "six.gif" );
		cardImages[6] = new ImageIcon( "seven.gif" );
		cardImages[7] = new ImageIcon( "eight.gif" );
		cardImages[8] = new ImageIcon( "nine.gif" );
		cardImages[9] = new ImageIcon( "ten.gif" );
		cardImages[10] = new ImageIcon( "jack.gif" );
		cardImages[11] = new ImageIcon( "queen.gif" );
		cardImages[12] = new ImageIcon( "king.gif" );
	}

	public Component getTreeCellRendererComponent( JTree tree,
					Object value, boolean bSelected, boolean bExpanded,
							boolean bLeaf, int iRow, boolean bHasFocus )
	{
		// Find out which node we are rendering and get its text
		DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
		String	labelText = (String)node.getUserObject();

		this.bSelected = bSelected;
		
		// Set the correct foreground color
		if( !bSelected )
			setForeground( Color.black );
		else
			setForeground( Color.white );

		// Determine the correct icon to display
		if( labelText.equals( "Deck" ) )
			setIcon( deckImage );
		else if( labelText.equals( "Clubs" ) )
			setIcon( suitImages[0] );
		else if( labelText.equals( "Diamonds" ) )
			setIcon( suitImages[1] );
		else if( labelText.equals( "Spades" ) )
			setIcon( suitImages[2] );
		else if( labelText.equals( "Hearts" ) )
			setIcon( suitImages[3] );
		else if( labelText.equals( "Ace" ) )
			setIcon( cardImages[0] );
		else if( labelText.equals( "Two" ) )
			setIcon( cardImages[1] );
		else if( labelText.equals( "Three" ) )
			setIcon( cardImages[2] );
		else if( labelText.equals( "Four" ) )
			setIcon( cardImages[3] );
		else if( labelText.equals( "Five" ) )
			setIcon( cardImages[4] );
		else if( labelText.equals( "Six" ) )
			setIcon( cardImages[5] );
		else if( labelText.equals( "Seven" ) )
			setIcon( cardImages[6] );
		else if( labelText.equals( "Eight" ) )
			setIcon( cardImages[7] );
		else if( labelText.equals( "Nine" ) )
			setIcon( cardImages[8] );
		else if( labelText.equals( "Ten" ) )
			setIcon( cardImages[9] );
		else if( labelText.equals( "Jack" ) )
			setIcon( cardImages[10] );
		else if( labelText.equals( "Queen" ) )
			setIcon( cardImages[11] );
		else if( labelText.equals( "King" ) )
			setIcon( cardImages[12] );

		// Add the text to the cell
		setText( labelText );

		return this;
	}

	// This is a hack to paint the background.  Normally a JLabel can
	// paint its own background, but due to an apparent bug or
	// limitation in the TreeCellRenderer, the paint method is
	// required to handle this.
	public void paint( Graphics g )
	{
		Color		bColor;
		Icon		currentI = getIcon();

		// Set the correct background color
		bColor = bSelected ? SystemColor.textHighlight : Color.white;
		g.setColor( bColor );

		// Draw a rectangle in the background of the cell
		g.fillRect( 0, 0, getWidth() - 1, getHeight() - 1 );

		super.paint( g );
	}

}

Chiao
Craven
 

Craven

Aktives Mitglied
Ich glaub, ich hab ein komplettes Beispiel gefunden! Hab aber keine Bilder hier!

Kann das Beispiel mal jemand ausprobieren und das Ergebnis posten?!

Code:
// Imports
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;

class RenderTreeExample
		extends 	JFrame
 {
	// Instance attributes used in this example
	private	JPanel		topPanel;
	private	JTree		tree;
	private	JScrollPane scrollPane;

	// Constructor of main frame
	public RenderTreeExample()
	{
		// Set the frame characteristics
		setTitle( "Custom Rendered Tree Application" );
		setSize( 300, 200 );
		setBackground( Color.gray );

		// Create a panel to hold all other components
		topPanel = new JPanel();
		topPanel.setLayout( new BorderLayout() );
		getContentPane().add( topPanel );

		// Create data for the tree
		DefaultMutableTreeNode root
					= new DefaultMutableTreeNode( "Deck" );

		DefaultMutableTreeNode itemClubs
					= new DefaultMutableTreeNode( "Clubs" );
		addAllCard( itemClubs );
		root.add( itemClubs );

		DefaultMutableTreeNode itemDiamonds
					= new DefaultMutableTreeNode( "Diamonds" );
		addAllCard( itemDiamonds );
		root.add( itemDiamonds );

		DefaultMutableTreeNode itemSpades
					= new DefaultMutableTreeNode( "Spades" );
		addAllCard( itemSpades );
		root.add( itemSpades );

		DefaultMutableTreeNode itemHearts
					= new DefaultMutableTreeNode( "Hearts" );
		addAllCard( itemHearts );
		root.add( itemHearts );

		// Create a new tree control
		DefaultTreeModel treeModel = new DefaultTreeModel( root );
		tree = new JTree( treeModel );

        // Tell the tree it is being rendered by our application
        tree.setCellRenderer( new CustomCellRenderer() );

		// Add the listbox to a scrolling pane
		scrollPane = new JScrollPane();
		scrollPane.getViewport().add( tree );
		topPanel.add( scrollPane, BorderLayout.CENTER );
	}

	// Helper method to write an enitre suit of cards to the
	// current tree node
	public void addAllCard( DefaultMutableTreeNode suit )
	{
		suit.add( new DefaultMutableTreeNode( "Ace" ) );
		suit.add( new DefaultMutableTreeNode( "Two" ) );
		suit.add( new DefaultMutableTreeNode( "Three" ) );
		suit.add( new DefaultMutableTreeNode( "Four" ) );
		suit.add( new DefaultMutableTreeNode( "Five" ) );
		suit.add( new DefaultMutableTreeNode( "Six" ) );
		suit.add( new DefaultMutableTreeNode( "Seven" ) );
		suit.add( new DefaultMutableTreeNode( "Eight" ) );
		suit.add( new DefaultMutableTreeNode( "Nine" ) );
		suit.add( new DefaultMutableTreeNode( "Ten" ) );
		suit.add( new DefaultMutableTreeNode( "Jack" ) );
		suit.add( new DefaultMutableTreeNode( "Queen" ) );
		suit.add( new DefaultMutableTreeNode( "King" ) );
	}

	// Main entry point for this example
	public static void main( String args[] )
	{
		// Create an instance of the test application
		RenderTreeExample mainFrame	= new RenderTreeExample();
		mainFrame.setVisible( true );
	}
}

The code listing for CustomCellRenderer.java is: 


// Imports
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;

public class CustomCellRenderer
		extends		JLabel
		implements	TreeCellRenderer
{
   private ImageIcon		deckImage;
   private ImageIcon[]		suitImages;
   private ImageIcon[]		cardImages;
	private boolean			bSelected;


	public CustomCellRenderer()
	{
		// Load the images
		deckImage = new ImageIcon( "deck.gif" );

		suitImages = new ImageIcon[4];
		suitImages[0] = new ImageIcon( "clubs.gif" );
		suitImages[1] = new ImageIcon( "diamonds.gif" );
		suitImages[2] = new ImageIcon( "spades.gif" );
		suitImages[3] = new ImageIcon( "hearts.gif" );

		cardImages = new ImageIcon[13];
		cardImages[0] = new ImageIcon( "ace.gif" );
		cardImages[1] = new ImageIcon( "two.gif" );
		cardImages[2] = new ImageIcon( "three.gif" );
		cardImages[3] = new ImageIcon( "four.gif" );
		cardImages[4] = new ImageIcon( "five.gif" );
		cardImages[5] = new ImageIcon( "six.gif" );
		cardImages[6] = new ImageIcon( "seven.gif" );
		cardImages[7] = new ImageIcon( "eight.gif" );
		cardImages[8] = new ImageIcon( "nine.gif" );
		cardImages[9] = new ImageIcon( "ten.gif" );
		cardImages[10] = new ImageIcon( "jack.gif" );
		cardImages[11] = new ImageIcon( "queen.gif" );
		cardImages[12] = new ImageIcon( "king.gif" );
	}

	public Component getTreeCellRendererComponent( JTree tree,
					Object value, boolean bSelected, boolean bExpanded,
							boolean bLeaf, int iRow, boolean bHasFocus )
	{
		// Find out which node we are rendering and get its text
		DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
		String	labelText = (String)node.getUserObject();

		this.bSelected = bSelected;
		
		// Set the correct foreground color
		if( !bSelected )
			setForeground( Color.black );
		else
			setForeground( Color.white );

		// Determine the correct icon to display
		if( labelText.equals( "Deck" ) )
			setIcon( deckImage );
		else if( labelText.equals( "Clubs" ) )
			setIcon( suitImages[0] );
		else if( labelText.equals( "Diamonds" ) )
			setIcon( suitImages[1] );
		else if( labelText.equals( "Spades" ) )
			setIcon( suitImages[2] );
		else if( labelText.equals( "Hearts" ) )
			setIcon( suitImages[3] );
		else if( labelText.equals( "Ace" ) )
			setIcon( cardImages[0] );
		else if( labelText.equals( "Two" ) )
			setIcon( cardImages[1] );
		else if( labelText.equals( "Three" ) )
			setIcon( cardImages[2] );
		else if( labelText.equals( "Four" ) )
			setIcon( cardImages[3] );
		else if( labelText.equals( "Five" ) )
			setIcon( cardImages[4] );
		else if( labelText.equals( "Six" ) )
			setIcon( cardImages[5] );
		else if( labelText.equals( "Seven" ) )
			setIcon( cardImages[6] );
		else if( labelText.equals( "Eight" ) )
			setIcon( cardImages[7] );
		else if( labelText.equals( "Nine" ) )
			setIcon( cardImages[8] );
		else if( labelText.equals( "Ten" ) )
			setIcon( cardImages[9] );
		else if( labelText.equals( "Jack" ) )
			setIcon( cardImages[10] );
		else if( labelText.equals( "Queen" ) )
			setIcon( cardImages[11] );
		else if( labelText.equals( "King" ) )
			setIcon( cardImages[12] );

		// Add the text to the cell
		setText( labelText );

		return this;
	}

	// This is a hack to paint the background.  Normally a JLabel can
	// paint its own background, but due to an apparent bug or
	// limitation in the TreeCellRenderer, the paint method is
	// required to handle this.
	public void paint( Graphics g )
	{
		Color		bColor;
		Icon		currentI = getIcon();

		// Set the correct background color
		bColor = bSelected ? SystemColor.textHighlight : Color.white;
		g.setColor( bColor );

		// Draw a rectangle in the background of the cell
		g.fillRect( 0, 0, getWidth() - 1, getHeight() - 1 );

		super.paint( g );
	}

}

Chiao
Craven
 
B

Beni

Gast
Ich mach mal ein Beispiel.

:!: Aber: dieses Beispiel funktioniert nur, wenn die Dateien (die angezeigt werden) tatsächlich existieren.
Darum darf man nicht
Code:
File file = ...
File[] childs = file.listFiles();
verwenden, sondern muss
Code:
FileSystemView system = ... // siehe Konstruktor von Renderer
File file = ...
File[] childs = view.getFiles( file, true );
benutzen :!:

Das ist der CellRenderer
Code:
 public class Renderer extends DefaultTreeCellRenderer{
    private FileSystemView system; // die brauchen wir für die Icons

    public Renderer(){
      // Der Konstruktor
      system = FileSystemView.getFileSystemView();
    }

    public Component getTreeCellRendererComponent(JTree tree, Object value,
        boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){

      super.getTreeCellRendererComponent( tree, "", selected, expanded, leaf, row, hasFocus );

      File file = (File)value

      // Diese beiden Zeilen funktionieren nur, wenn die Datei offiziel existiert. !!!
      setIcon( system.getSystemIcon( file ));
      setText( system.getSystemDisplayName( file ));

      return this;
    }
  }
}

[Edit: jetzt war jemand schneller :wink: ]

mfg Beni
 
G

Guest

Gast
Das bedeutet aber nun das ,man nur icons nutzen kann die man selber auf den rechner als z.B. jpg oder gif datei hat. z.B. folder.gif
 
S

steffan

Gast
Nein glaub das kann nicht sein. In dem Code werden auch keine gif oder jpg Datei benutzt und trotzdem zeigt er für jede Datei das richtige Icon an.

Code:
import java.io.*; 

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

public class lernen extends JTree{ 
  public static void main( String[] args ){ 
	JFrame frame = new JFrame(); 
	frame.getContentPane().add( new JScrollPane( new lernen() ) ); 
	frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 
	frame.pack(); 
	frame.setLocationRelativeTo( null ); 
	frame.setVisible( true ); 
  } 

  private static FileSystemView SYSTEM = FileSystemView.getFileSystemView(); 

  public lernen(){ 
	setModel( new FileTreeModel() ); 
	setCellRenderer( new FileTreeCellRenderer() ); 
  } 

  private class FileTreeCellRenderer extends DefaultTreeCellRenderer{ 
	public FileTreeCellRenderer(){ 
      
	} 

	public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean exp, boolean leaf, int row, boolean focus ){ 
	  super.getTreeCellRendererComponent( tree, value, sel, exp, leaf, row, focus ); 
          
	  File file = (File)value; 
      
	  setIcon( SYSTEM.getSystemIcon( file ) ); 
	  setText( SYSTEM.getSystemDisplayName( file )); 
      
	  return this; 
	} 
  } 

  private class FileTreeModel implements TreeModel { 
	public FileTreeModel() { 

	} 

	public Object getRoot() { 
	  return SYSTEM.getHomeDirectory();   // <<<<<<<<<<<<<<<<<<<<<<< Der ist wichtig 
	} 

	public int getChildCount(Object parent) { 
	  return SYSTEM.getFiles( (File) parent, true). 
		  length; 
	} 

	public boolean isLeaf(Object node) { 
	  return ( (File) node).isFile(); 
	} 

	public void addTreeModelListener(TreeModelListener l) { 
	} 

	public void removeTreeModelListener(TreeModelListener l) { 
	} 

	public Object getChild(Object parent, int index) { 
	  return FileSystemView.getFileSystemView().getFiles( (File) parent, true)[ 
		  index]; 
	} 

	public int getIndexOfChild(Object parent, Object child) { 
	  File[] files = SYSTEM.getFiles( (File) parent, true); 

	  for (int i = 0; i < files.length; i++) 
		if (files[i] == child) 
		  return i; 

	  return -1; 
	} 

	public void valueForPathChanged(TreePath path, Object newValue) { 
	} 
  } 
}
 
B

Beni

Gast
Anonymous hat gesagt.:
Das bedeutet aber nun das ,man nur icons nutzen kann die man selber auf den rechner als z.B. jpg oder gif datei hat. z.B. folder.gif
Irgendwo müssen diese Bilder schon sein ...
... aber Du musst nicht wissen wo.

Die beiden Progis finden die benötigten Bilder, passend zum System (wenn auf deinem PC *.java Dateien mit einem grünen Kreis angezeigt werden, werden auch diese Progis grüne Kreise zeichnen!)
 
G

Guest

Gast
Ah so ok. Obowhl ich zwar ein etwas anderes TreeModel habe müßte ich doch aber folgendes benutzten können oder?

Die RendererKlasse
Code:
 private class FileTreeCellRenderer extends DefaultTreeCellRenderer{ 
   public FileTreeCellRenderer(){ 
      
   } 

   public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean exp, boolean leaf, int row, boolean focus ){ 
     super.getTreeCellRendererComponent( tree, value, sel, exp, leaf, row, focus ); 
          
     File file = (File)value; 
      
     setIcon( SYSTEM.getSystemIcon( file ) ); 
     setText( SYSTEM.getSystemDisplayName( file )); 
      
     return this; 
   } 
  }

dann noch
Code:
private static FileSystemView SYSTEM = FileSystemView.getFileSystemView();

und an den Tree muss ich noch ranhängen
Code:
jTree.setCellRenderer( new FileTreeCellRenderer() );

und dann müßte es doch eigentlich gehen
 
B

Beni

Gast
Theoretisch: ja.
Praktisch: Must du als Nodes Instancen von File benutzen (Da sonst Object value kein File ist). Und du musst darauf achten, dass diese Files auch existieren (File.exists() ), weil sonst SYSTEM.getXXX eine Exception wirft.
 
S

Steffan

Gast
siehste ich wollt nachher mal testen was auf einen Linux rechner passiert. Hmm er erkennt doch dort auch das System. warum sollte es dort nicht auch gehen?
 
B

Beni

Gast
Craven hat gesagt.:
Problem daran dürfe allerdings sein, daß es nur unter Windows funktioniert!
Hallo! Java ist plattformunabhaengig :!:

Auch wenns bei Linux nicht so schoen aussieht, funktionieren wird es (machen wir eine Wette?) :D

mfg Beni
 
G

Guest

Gast
hat linux keine eigenen Symbole für verschiedene daten? wenn ja müßten die dann erscheinen.
 

Craven

Aktives Mitglied
Das hast Du jetzt gut erkannt! Das Problem kann man aber umgehen, indem man anstatt Swing, SWT benutzt! Schließlich benutzt SWT das native Toolkit, welches lokal installiert ist! In dem Fall Gnome
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Swing XML Datei in JTree, Problem mit Daten einlesen AWT, Swing, JavaFX & SWT 34
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

Ähnliche Java Themen

Neue Themen


Oben