# Knoten-Attribute einer xsd-Datei in einem JTree auslesen



## Perplex (18. Jul 2005)

Hallo,

ich habe folgendes Problem:

ich habe ein JSplitPane in dem linkes eine geladene xsd-Datei als JTree angezeigt wird und rechts ein Panel in dem Eingabefelder erscheinen sollen wenn man die Knoten oder Blätter des JTrees anklickt! 

Ein Knoten kann z.B. so aussehen:

<xsd:element name="description" type="xsd:string" minOccurs="0"/>

Nun will ich, daß das Attribu "name" ausgelesen wird und als JLabel im Panel erscheint. Dann soll im selbern Schritt das Attribut "type" ausgelesen werden um zu entscheiden wie das Eingabefeld aussehen soll, also z.B. ein Textfeld bei einem String oder eine Checkbox bei einem boolschen Wert. Dieses Eingabefeld soll rechts neben dem JLabel erscheinen. Mein Ansatz sieht jetzt so aus:


```
public void valueChanged(TreeSelectionEvent event) {
    	
    	
    	TreePath tp = event.getPath();
    	
    	if (tp != null){
    		
    		System.out.println("  Selektiert: " + tp.toString());
    		
    		
    		
    		
    		JLabel lab1 = new JLabel(((JTree)event.getSource()).getSelectionPath().toString());
    		JTextField text = new JTextField("hallo", 10);
    		Box upper = new Box(BoxLayout.X_AXIS);
    		upper.add(lab1);
    		upper.add(text);
    		mainbox.add(upper);
    		
    		
    		
    	} else {
    		
    		System.out.println("  Kein Element selektiert");
    		
    	}
    }
```

Aber das führt leider nicht zum gewünschten Ergebnis! 
Wäre dankbar wenn Jemand einen Vorschlag hat wie man Attribute in einem JTree auslesen kann!


----------



## Roar (18. Jul 2005)

ich hoffe du speicherst keine strings in deinem tree, sondern dom Elements. wenn nicht stell das um und implementiere einen entsprechenden renderer.
dann kannst du in der valueChanged dein selektiertes object in ein Element parsen, die attribute mittels DOM auslesen. ein paar if abfragen sollten den rest machen


----------



## Perplex (18. Jul 2005)

Ne, sind DOM Elements! Aber ich hab keine Ahnung von den Renderer-Sachen, hab mich ja vor kurzen erst in diese JTree-Sachen eingearbeitet! Vielleicht hast Du'n Code-Beispiel wie Du das gemeint hast? Danke übrigens für Deine Antwort!


----------



## Roar (18. Jul 2005)

```
tree.setRenderer(new XMLDocumentTreeRenderer());

...

class XMLDocumentTreeRenderer extends DefaultTreeRenderer {

	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);
		if(value instanceof Element) {
			setText(((Element) value).getNodeName());
			setIcon(buntesBildchen);
		]
		return this;
	}
}

...

	public void valueChanged(TreeSelectionEvent event) {
       
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) ((JTree) event.getSource())
				.getLastSelectedPathComponent();
		if(node == null)
			return;

		Object user = node.getUserObject();
		if(user instanceof Element) {
			Element e = (Element) user;
			String name = e.getAttribute("name");
			String type = e.getAttribute("type");
			JLabel lab = new JLabel(name);
			irgendwohin.add(lab);
			JComponent comp = null;
			if(type.equals("xsd:string")) {
				comp = new JTextField();
			} else if(type.equals("xsd:boolean")) {
				comp = new JCheckBox();
			}
			irgendwoAnders.add(comp);
		}
	}
```

so ungefähr?


----------



## Perplex (19. Jul 2005)

Sieht super aus!! Ganz herzlichen Dank! Aber einige Sachen klappen so nicht! In bin noch am rumprobieren!


----------



## Perplex (19. Jul 2005)

Hab's jetzt so: 
	
	
	
	





```
public void valueChanged (TreeSelectionEvent event){
    	
    	DefaultMutableTreeNode node = (DefaultMutableTreeNode) ((JTree) event.getSource()) 
        .getLastSelectedPathComponent(); 
        
    	if(node == null) 
            return; 
        
    	Object user = node.getUserObject(); 
    	 if(user instanceof Element){
    	 	
    	 	Element e = (Element) user; 
    	 	//AttributeSet name =  e.getAttributes(); 
    	 	String name = (String) ((AttributeSet) e).getAttribute("name");
    	 	String type = (String) ((AttributeSet) e).getAttribute("type"); 
    	 	JLabel lab = new JLabel(name); 
    	 	Box upper = new Box(BoxLayout.X_AXIS);
    	 	upper.add(lab);
    	 	JComponent comp = null; 
    	 	
    	 	if(type.equals("xsd:element")){
    	 		
    	 		comp = new JTextField("hallo",20); 
    	 		upper.add(comp);
    	 		upper.add(lab);
    	 		mainbox.add(upper);
    	 	
    	 	}else if(type.equals("xsd:attribute")) {
    	 		
    	 		comp = new JCheckBox(); 
    	 		upper.add(comp);
    	 		upper.add(lab);
    	 		mainbox.add(upper);
    	 	}
    
    	 }
    }
```

Aber irgendwie klappt's nicht! Beim Anklicken der Knoten passiert gar nichts! Ich füge das Label und das Textfeld( oder Checkbox) in eine Box mit x-Ausrichtung und dann diese Box in eine andere mit y-Ausrichtung(mainbox). Hast Du ne Idee wo der Fehler ist? Vielleicht die umständlichen Cast-Ausdrücke? So wie Du das da hattest ging's jedenfalls nicht!


----------



## Perplex (19. Jul 2005)

Also es ist so, daß die Zeile

```
String name = (String) ((AttributeSet) e).getAttribute("name");
```
 immer den kompletten Knoten-Inhalt ausgibt, völlig egal, was man in die Argument-Klammern von getAttribute() schreibt! Ich möchte ja, daß z.B. bei dem Attribut "name" einfach nur "name" als JLabel neben dem Eingabefeld erscheint und nicht z.B: "name=topic" . Die Zeilen 
	
	
	
	





```
String name = (String) ((AttributeSet) e).getAttribute("name");
```
 und 
	
	
	
	





```
String type = (String) ((AttributeSet) e).getAttribute("type");
```
 liefern übrignes genau das selbe, nämlich eben den kompletten Knoten-Inhalt! Aber selbst das klappt nicht, weil das Panel bei Anklicken der Tree-Elemente gar nichts anzeigt! Ich bekomme auch eine ClassCastException in der Zeile 
	
	
	
	





```
Element e = (Element) user;
```
 Hast Du ne Idee was man da machen könnte?


----------



## Perplex (19. Jul 2005)

Ich hab's jetzt so:
	
	
	
	





```
Object user = node.getUserObject(); 
    	// if(user instanceof Element){
    	 System.out.println(user);	
    	 	Object e =  user; 
    	 	//AttributeSet name =  e.getAttributes(); 
    	 	String name = (String) ((AttributeSet) e).getAttribute("name");
    	 	System.out.println(name);
    	 	String type = (String) ((AttributeSet) e).getAttribute("type"); 
    	 	//System.out.println(type);
    	 	JLabel lab = new JLabel(name); 
    	 	Box upper = new Box(BoxLayout.X_AXIS);
    	 	upper.add(lab);
    	 	JComponent comp = null;
```
 Dann ist zwar die Exception in der Zeile
	
	
	
	





```
Element e = (Element) user;
```
 verschwunden, aber dann dafür wieder ne andere ClassCastException in der Zeile
	
	
	
	





```
String name = (String) ((AttributeSet) e).getAttribute("name");
```
 Ich glaub, ich hab jetzt das totale Casting-Chaos!!!


----------



## Roar (19. Jul 2005)

hää?? wat soll denn das? ich ging davon aus dass du die w3c dom api verwendest. was is das fürn quatsch mti attribute sets?


----------



## Perplex (19. Jul 2005)

Das weiß ich auch nicht! Ich arbeite mit eclipse und das wurde mir als mögliche Fehlerbehebungs-Maßnahme angezeigt! Jedenfalls so wie Du's mir aufgeschrieben hattest, ging's nicht! Jedenfalls liefert das den Inhalt des Knotens! Aber der Rest klappt trotzdem nicht, das Panel bleibt immer leer! Hast Du keine Idde, wie man das richtig casten könnte?


----------



## Perplex (19. Jul 2005)

Hier ist der komplette Code! Vielleicht kannst Du's mal bei Dir laufen lassen:

```
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.Element;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.TreeSelectionModel;

import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/*
 * Created on 15.07.2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author Manuel
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Formular extends JFrame implements ActionListener, TreeSelectionListener{
    
    
    private static DefaultMutableTreeNode treeNode;
    private Box mainbox;
    
    private static JPanel contentPane = new JPanel();
    private static DefaultMutableTreeNode treeRoot = new DefaultMutableTreeNode("Click File -> New/Load");
    private static DefaultTreeModel model = new DefaultTreeModel(treeRoot);
    private static JTree tree = new JTree(model);
    
    private static JSplitPane splitPane;
    private static Node node;
    
    private static JPanel panel = new JPanel();
    
    private static JMenuBar menuBar = new JMenuBar();
    private JMenuItem makeNew = new JMenuItem ("New");
    private JMenuItem load = new JMenuItem ("Load");
    private JMenuItem save = new JMenuItem ("Save");
    private JMenuItem exit = new JMenuItem ("Exit");
    private JMenu file = new JMenu ("File");
    private File datei;
    
    
    public Formular() {
        
      setContentPane(contentPane);
      setJMenuBar(menuBar);
      setTitle( "Formular-Plugin" );
      setBackground( Color.blue );
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
      TreeSelectionModel tsm = new DefaultTreeSelectionModel();
      tsm.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);   //Einfachselektion aktivieren
      tree.setSelectionModel(tsm);
      tree.setCellRenderer(new XMLDocumentTreeRenderer()); 
      mainbox = new Box(BoxLayout.Y_AXIS);
      panel.add(mainbox);
      
      load.setToolTipText("loading a new file");
      
      MouseListener ml = new MouseAdapter() {
      	public void mousePressed(MouseEvent e) {
      		//  int selRow = tree.getRowForLocation(e.getX(), e.getY());
      		//   TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
      		// if(selRow != -1) {
      		if(e.getClickCount() == 1) {
      			System.out.println("1 klicked");
      		}
      		else if(e.getClickCount() == 2) {
      			System.out.println("2 klicked");
      			
      			
      			//}
      		}
      	}
      };
      tree.addMouseListener(ml);
      
      
      
      
      
      
      
      tree.addTreeSelectionListener(this);
      
      
      
      
      
      splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
      
      file.add(makeNew);
      file.add(load);
      file.add(save);
      file.add(exit);
      menuBar.add(file);
      
      exit.addActionListener(this);
      makeNew.addActionListener(this);
      save.addActionListener(this);
      load.addActionListener(this);
      
      try {
      	
      	JFrame frame = new JFrame ("Formular-Plugin");
      	frame.setContentPane(contentPane);
      	frame.setJMenuBar(menuBar);
      	frame.addWindowListener(new WindowAdapter(){
      		public void windowClosing (WindowEvent we){
      			System.exit(0);
      		}});
      	frame.getContentPane().setLayout(new FlowLayout());
      	frame.getContentPane().add(splitPane);
      	splitPane.setLeftComponent(new JScrollPane(tree));
      	splitPane.setRightComponent(new JScrollPane(panel));
      	//contentPane.setFocusable(false);
      	splitPane.setDividerLocation(350);
      	splitPane.setPreferredSize(new Dimension(685, 510));
      	
      	frame.pack();
      	frame.setSize(700, 600);
      	frame.setLocation(100, 100);
      	frame.setVisible(true);
      	
      } catch (Exception e){
      	
      }
      
    }
    
    
    public static void xmlToTree (Node node, DefaultMutableTreeNode treeNode){
        
        DefaultMutableTreeNode helperTreeNode;
        DefaultMutableTreeNode helperTreeNode2;
        DefaultMutableTreeNode helperTreeNode3;
        
        switch (node.getNodeType()){
        
        case Node.DOCUMENT_NODE:
            
            Document doc = (Document)node ;
            xmlToTree(doc.getDocumentElement() , treeNode);
           
            break;
            
        case Node.ELEMENT_NODE:
            
            String name = node.getNodeName();
            helperTreeNode = new DefaultMutableTreeNode(name);
            treeNode.add(helperTreeNode);
            
            NamedNodeMap attributes = node.getAttributes();
            
             for (int i = 0; i < attributes.getLength(); i++){
               
                Node current = attributes.item(i);
                helperTreeNode2 = new DefaultMutableTreeNode(current.getNodeName()+ "=" + "\"" + current.getNodeValue() + "\"" );
                helperTreeNode.add(helperTreeNode2);
                
            }
           
             NodeList children = node.getChildNodes();
             if (children.getLength() != 0){
                 
                 for (int i = 0; i < children.getLength(); i++){
                     
                     xmlToTree(children.item(i), helperTreeNode); //hier wird die Methode rekursiv aufgerufen
                 }
             }
           break;
        
        case Node.COMMENT_NODE:
        case Node.TEXT_NODE:
        case Node.CDATA_SECTION_NODE:
            
            String nodeValue = node.getNodeValue();
            nodeValue = nodeValue.trim();
            
            if (nodeValue.length() != 0){
                
                helperTreeNode3 = new DefaultMutableTreeNode(nodeValue);
                treeNode.add(helperTreeNode3);
            }
            
            break;
        
        
        }
    
       }
    
    public void performParsing(String uri){
        
        treeRoot = new DefaultMutableTreeNode("?xml version=\"1.0\" encoding=\"ISO-8859-1\"?");
        
        try {
            DOMParser parser = new DOMParser();
            parser.setFeature("http://xml.org/sax/features/validation", true);
            parser.setFeature("http://apache.org/xml/features/validation/schema", true);
            parser.parse(uri);
            Document doc = parser.getDocument();
            xmlToTree(doc, treeRoot);
        }
       
        catch (Exception e){
            System.out.println("Parsing Error: " + e.getMessage());
        }
        
        model = new DefaultTreeModel(treeRoot);
         tree = new JTree(model);
         tree.addTreeSelectionListener(this);
         tree.setRootVisible(true);
         TreeSelectionModel tsm = new DefaultTreeSelectionModel();
         tsm.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
         tree.setSelectionModel(tsm);
         splitPane.setLeftComponent(new JScrollPane(tree));
         splitPane.setDividerLocation(350);
         tree.setEditable(true);
    }
    
    

    
    
    
    public void loading (File datei){
        
        JFileChooser fileChooser = new JFileChooser();
        int returnVal = fileChooser.showOpenDialog(this);
        
        if(returnVal == JFileChooser.APPROVE_OPTION){
            
            datei = fileChooser.getSelectedFile();
            String pfad = datei.getAbsolutePath();
            
            //performParsing(pfad);
            int check = JOptionPane.showOptionDialog(tree, "File " + "\"" + datei.getName() + "\"" + " is not wellformed! Open anyway? "
                    , "File Exists", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[] {
                    "Yes", "Ignore", "Cancel"
                    },"");
            
            switch (check){
               
             case 0:  // Yes
                performParsing(pfad);
                break;
             case 1:  // Ignore
              return;
             default: // Cancel
              return;
            }
        
        
        
        }
    }
    
    
    
    
    
    
    
    
    
    public void actionPerformed(ActionEvent e) {
        
        
           if (e.getSource() == load)
               loading(datei);
        
    }

    
    public static void main(String [] args) {
        
        Formular formular = new Formular();
        
    
            
        }
    
    
    /* (non-Javadoc)
     * @see javax.swing.event.TreeSelectionListener#valueChanged(javax.swing.event.TreeSelectionEvent)
     */
  /*  public void valueChanged(TreeSelectionEvent event) {
    	
    	
    	TreePath tp = event.getPath();
    	
    	if (tp != null){
    		
    		System.out.println("  Selektiert: " + tp.toString());
    		
    		
    		
    		
    		JLabel lab1 = new JLabel(((JTree)event.getSource()).getSelectionPath().toString());
    		JTextField text = new JTextField("hallo", 10);
    		Box upper = new Box(BoxLayout.X_AXIS);
    		upper.add(lab1);
    		upper.add(text);
    		mainbox.add(upper);
    		
    		
    		
    	} else {
    		
    		System.out.println("  Kein Element selektiert");
    		
    	}
    }*/
    
    public void valueChanged (TreeSelectionEvent event){
    	
    	DefaultMutableTreeNode node = (DefaultMutableTreeNode) ((JTree) event.getSource()) 
        .getLastSelectedPathComponent(); 
        
    	if(node == null) 
            return; 
        
    try {
    	Object user = node.getUserObject(); 
    
    	// if(user instanceof Element){
    	 System.out.println(user);	
    	 	Object e =  user; 
    	 	//AttributeSet name =  e.getAttributes(); 
    	 	String name = (String) ((AttributeSet) e).getAttribute("name");
    	 	System.out.println(name);
    	 	String type = (String) ((AttributeSet) e).getAttribute("type"); 
    	 	//System.out.println(type);
    	 	JLabel lab = new JLabel(name); 
    	 	Box upper = new Box(BoxLayout.X_AXIS);
    	 	upper.add(lab);
    	 	JComponent comp = null; 
    	 	
    	 	if(type.equals("xsd:element")){
    	 		
    	 		comp = new JTextField("hallo",20); 
    	 		upper.add(comp);
    	 		upper.add(lab);
    	 		mainbox.add(upper);
    	 	
    	 	}else if(type.equals("xsd:attribute")) {
    	 		
    	 		comp = new JCheckBox(); 
    	 		upper.add(comp);
    	 		upper.add(lab);
    	 		mainbox.add(upper);
    	 	}
    } catch (Exception e){
    	System.out.println("da lief aber was gewaltig schief!");
    }
    	 }
  //  }
    
}
```
 und die Klasse XMLDocumentTreeRenderer gehört auch noch dazu: 
	
	
	
	





```
import java.awt.Component;

import javax.swing.JTree;
import javax.swing.text.Element;
import javax.swing.tree.DefaultTreeCellRenderer;

public class XMLDocumentTreeRenderer extends 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); 
		       
				   if(value instanceof Element) { 
			         setText(((Element) value).getName()); 
			         setIcon(leafIcon); 
				   }  
			      return this; 
			   } 
	}
```
  Ich steig da echt nicht mehr durch!


----------



## Perplex (19. Jul 2005)

Ach Mist, hab eine Klammer der Code-Tags falsch gesetzt! Statt ner eckigen ne runde Klammer! Na ja, kannst es aber trotzdem erkennen, oder?  :?


----------



## Roar (19. Jul 2005)

Perplex hat gesagt.:
			
		

> Das weiß ich auch nicht! Ich arbeite mit eclipse und das wurde mir als mögliche Fehlerbehebungs-Maßnahme angezeigt



omg ey! ich werd nicht mehr, da sieht man mal was ein ctrl+shift+o alles anrichten kann. lern erstmal java, schmeiß eclipse weg und schreib deine imports selbst, is ja kei nwunder das das nicht geht bei dir. am besten wirfst du den code weg und schreibst's nochmal neu


----------



## Perplex (19. Jul 2005)

Hmm...ja, ist etwas chaotisch bei mir, aber ich denke der Ansatz ist nicht so schlecht! Ja, ich bin nicht so der java-Crack, aber wozu jetzt imports schreiben? Ist doch alles da was ich brauche! Es geht doch nur um die cast-Ausdrücke! Da liegt der Fehler! Hast Du wirklich keine Idee wie man den Kram richtig castet? Ich meine, so wie Du's vorgeschlagen hast, klappt's ja nicht! Ist wirklich wichtig, daß ich das noch zum laufen kriege!


----------



## Roar (19. Jul 2005)

Perplex hat gesagt.:
			
		

> aber wozu jetzt imports schreiben? Ist doch alles da was ich brauche! Es geht doch nur um die cast-Ausdrücke! Da liegt der Fehler! Hast Du wirklich keine Idee wie man den Kram richtig castet? Ich meine, so wie Du's vorgeschlagen hast, klappt's ja nicht!



nein, totaler quatsch, du importierst da müll den du berhaupt nicht brauchst, wahrscheinlich standen diese imports an erster stelle beim "import type" dialog in eclipse, was?mein code soltle so wie er ist funktinoieren, aber natürlich nur, wenn man fähig ist die richtigen typen zu importieren. du vermischst hier zwei apis die nix miteinander zu tun haben, weil es da zwei typen gibt die beide Element heißen. denk nochmal drüber nach und drück NIE mehr ctrl+1 doer ctrl+shift+o, danke


----------



## Perplex (19. Jul 2005)

Ja stimmt, Du hattest Recht, ich hab den falschn Import benutzt! Ich hab jetzt den hier:
	
	
	
	





```
import org.w3c.dom.Element;
```
 Mit dem klappt Dein Code! Aber trotzdem kann ich keine Eingabefelder im Panel anzeigen, weil dann wieder ne ClassCastException bekomme in der Zeile
	
	
	
	





```
Element e = (Element) user;
```
 Also wo liegt der Fehler????? Es gibt ja folgende Element-imports
	
	
	
	





```
import javax.swing.text.html.parser.Element;
import javax.swing.text.Element;
import org.w3c.dom.Element;
import com.sun.corba.se.internal.orbutil.Element;
```
 Aber die wrc-Version sollte doch die Richtige sein!!! Wo also ist der import-Fehler)))))))))) ???:L


----------



## Perplex (19. Jul 2005)

Sorry übrigens für die Tippfehler!! :wink: das kommt davon wenn man unter Zeitdruck schreibt!!!!!! :bae:


----------



## Roar (19. Jul 2005)

Perplex hat gesagt.:
			
		

> weil dann wieder ne ClassCastException bekomme in der Zeile
> 
> 
> 
> ...



wenn du wirklich die elemente den treenodes als object gegeben hast kommt dieser fehler nicht (das hab ich doch am anfang direkt gefragt)


----------



## Perplex (19. Jul 2005)

verstehe ich jetzt nicht so ganz????Schreib das doch mal auf was genau Du jetzt meinst! Aber du hast ja meinen kompletten Code! Das sollte doch Deine Frage beantworten! Und noch ne Frage: was genau macht der Renderer eigentlich? Brauch man den überhaupt? Entschuldige die blöden Fragen aber ich hab bei java noch nicht so den wahnsinns Durchblick! Hoffe, Du beantwortest meine Fragen trotzdem! :wink:


----------

