# JTree mit buttons



## rooksvelt (2. Jan 2007)

Hy Leute bin gerade dabei das ich für eine Firma ein Programm schreibe für die Buchhaltung und bin auf ein Problem gestoßen, ich möchte gerne einen JTree machen der mit wenn ich zum Beispiel ein Kind aufklappe dann mir 3 Buttons angezeigt werden und ich durch den klick auf einen Button diese Aktion ausgeführ werden soll!!

Das soll so ein Button sein wie ein Nomal Swing Button oder AWt Button

Beispiel

Rott
-Testn
    -Button1
    -Button2

Bitte um hilfe!!!
Thomas


----------



## Wildcard (2. Jan 2007)

Dafür brauchst du einen eigenen TreeCellRenderer


----------



## m@nu (3. Jan 2007)

und eigenen CellEditor und EventListener und und und...
ich hasse JTree's


----------



## Wildcard (3. Jan 2007)

m@nu hat gesagt.:
			
		

> ich hasse JTree's


Dann versuch mal einen Button in einen nativen SWT Tree zu machen  :wink:


----------



## rooksvelt (3. Jan 2007)

könnte mir irgndwer eine quellcode dazu hereinstellen?? i hab 0 plan wo ich da anfangen soll


----------



## Wildcard (3. Jan 2007)

Fang am besten in unseren FAQs an  :wink:


----------



## rooksvelt (3. Jan 2007)

ich hab schon einiges versucht, aber i bekomme keinen normalen Button als hintergrund wenn ich etwas aufklappen möchte, sondern immer nur vor dem wort einen satz oder so.


----------



## Wildcard (3. Jan 2007)

Bitte?


----------



## Gast (4. Jan 2007)

import java.awt.*; 
import java.awt.event.*; 
import java.util.*;

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

public class jtree
{
	public static void main(String args[])
	{
		JFrame frame = new JFrame("CBM-Projekt");
		JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 
		CBM Kassabuch[] = {
				new CBM("Eintrag"),
		        new CBM("Editieren"),
		        new CBM("Löschen"),
		        new CBM("Auflisten"), 
				new CBM("Drucken") };

		 CBM Kundenverwaltung[] = {
				 new CBM("Eintrag"),
				 new CBM("Editieren"),
				 new CBM("Löschen"),
				 new CBM("Auflisten"),
			     new CBM("Drucken") };

		 CBM Administrator[] = {
				 new CBM("Einstellungen"),
				 new CBM("Benutzer"),
				 new CBM("Login"),
				 new CBM("Infos")};

		 Vector KBVector = new NamedVector("Kassabuch", Kassabuch);
		 Vector KVVector = new NamedVector("Kundenverwaltung", Kundenverwaltung);
		 Vector ADVector = new NamedVector("Administrator", Administrator);
		 Object rootNodes[] = { KBVector, KVVector, ADVector };
		 Vector rootVector = new NamedVector("Root", rootNodes);
		 JTree tree = new JTree(rootVector);
		 TreeCellRenderer renderer = new BookCellRenderer();
		 tree.setCellRenderer(renderer);
		 JScrollPane scroll = new JScrollPane(tree);

		 JPanel lblPanel = new JPanel(); 
		 lblPanel.add(new JLabel("Guten Tag Frau Fuchs!!"));

		 sp.setLeftComponent(scroll); 
		 sp.setRightComponent(lblPanel);

		 Dimension minimumSize = new Dimension(500, 500); 
		 scroll.setMinimumSize(minimumSize); 
		 lblPanel.setMinimumSize(minimumSize); 
		 sp.setDividerLocation(200); 
		 sp.setPreferredSize(new Dimension(700, 500)); 

		 frame.getContentPane().add(sp); 
		 frame.setSize(700, 500);
		 frame.setVisible(true);
	}
}

class CBM
{
	  String title;

	  public CBM(String title) 
	  {
	    this.title = title;
	  }

	  public String getTitle() 
	  {
	    return title;
	  }
}

class CBMCellRenderer 
implements TreeCellRenderer 
{
	  JLabel titleLabel;
	  JPanel renderer;
	  DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
	  Color backgroundSelectionColor;
	  Color backgroundNonSelectionColor;

	  public CBMCellRenderer() 
	  {
		  renderer = new JPanel(new GridLayout(0, 1));
		  titleLabel = new JLabel(" ");
		  titleLabel.setForeground(Color.blue);
		  renderer.add(titleLabel);
		  renderer.setBorder(BorderFactory.createLineBorder(Color.black));
		  backgroundSelectionColor = defaultRenderer.getBackgroundSelectionColor();
		  backgroundNonSelectionColor = defaultRenderer.getBackgroundNonSelectionColor();
	  }

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

		  if ((value != null) && (value instanceof DefaultMutableTreeNode)) 
		  {
			  Object userObject = ((DefaultMutableTreeNode) value).getUserObject();

			  if (userObject instanceof CBM) 
			  {
				  CBM book = (CBM) userObject;
				  titleLabel.setText(book.getTitle());

				  if (selected) 
				  {
					  renderer.setBackground(backgroundSelectionColor);
				  } 
				  else 
				  {
					  renderer.setBackground(backgroundNonSelectionColor);
				  }

				  renderer.setEnabled(tree.isEnabled());
				  returnValue = renderer;
			  }
		  }

		  if (returnValue == null) 
		  {
			  returnValue = defaultRenderer.getTreeCellRendererComponent(tree,value, selected, expanded, leaf, row, hasFocus);
		  }

		  return returnValue;
	  }
}

class NamedVector 
extends Vector 
{
	  String name;

	  public NamedVector(String name) 
	  {
	    this.name = name;
	  }

	  public NamedVector(String name, Object elements[]) 
	  {
		  this.name = name;
		  for (int i = 0, n = elements.length; i < n; i++) 
		  {
			  add(elements_);
		  }
	  }

	  public String toString() 
	  {
		  return "[" + name + "]";
	  }
	}_


----------



## Gast (4. Jan 2007)

ja es sollte mir buttons anzeigen jedoch bekomme ich nur die speicheradresse


----------



## Wildcard (4. Jan 2007)

Ich sehe keinen einzigen Button in dem Quelltext. Benutz bitte Code-Tags.


----------



## rooksvelt (4. Jan 2007)

den button must du dir selbst zeichnen


----------



## Wildcard (4. Jan 2007)

nein


----------



## rooksvelt (5. Jan 2007)

renderer.setBorder(BorderFactory.createLineBorder(Color.black)); 

mit der Zeile zeichneich mir einen eigenen Button!

wie kann ich dann wie du meinst einen vordefinierten Button einfügen??  im Prinzip gehört dann nur mehr diese Zeile geändert!


----------



## Wildcard (5. Jan 2007)

Ein Renderer ist eine Component auf der die paint Methode aufgerufen wird. Wenn du eine Instanz eines Buttons als Renderer zurückgibts, dann wird auch ein Button gezeichnet.


----------



## rooksvelt (5. Jan 2007)

```
import java.awt.*; 
import java.util.*;
import javax.swing.*;  
import javax.swing.tree.*;

public class jtree
{
	public static void main(String args[])
	{
		JFrame frame = new JFrame("CBM-Projekt");
		JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 
		CBM Kassabuch[] = {
				new CBM("  Eintrag  "),
		        new CBM("  Editieren  "),
		        new CBM("  Löschen  "),
		        new CBM("  Auflisten  "), 
				new CBM("  Drucken  ") };
		
		 CBM Kundenverwaltung[] = {
				 new CBM("  Eintrag  "),
				 new CBM("  Editieren  "),
				 new CBM("  Löschen  "),
				 new CBM("  Auflisten  "),
			     new CBM("  Drucken  ") };
		 
		 CBM Administrator[] = {
				 new CBM("  Einstellungen  "),
				 new CBM("  Benutzer  "),
				 new CBM("  Login/Logout  "),
				 new CBM("  Informationen  ")};
		 
		 Vector KBVector = new NameVector("Kassabuch", Kassabuch);
		 Vector KVVector = new NameVector("Kundenverwaltung", Kundenverwaltung);
		 Vector ADVector = new NameVector("Administrator", Administrator);
		 Object rootNodes[] = { KBVector, KVVector, ADVector };
		 Vector rootVector = new NameVector("Root", rootNodes);
		 JTree tree = new JTree(rootVector);
		 TreeCellRenderer renderer = new CBMCellRenderer();
		 tree.setCellRenderer(renderer);
		 JScrollPane scroll = new JScrollPane(tree);
		 
		 JPanel lblPanel = new JPanel(); 
		 lblPanel.add(new JLabel("Guten Tag Frau Fuchs!!"));
		
		 sp.setLeftComponent(scroll); 
		 sp.setRightComponent(lblPanel);
		 
		 Dimension minimumSize = new Dimension(500, 500); 
		 scroll.setMinimumSize(minimumSize); 
		 lblPanel.setMinimumSize(minimumSize); 
		 sp.setDividerLocation(200); 
		 sp.setPreferredSize(new Dimension(700, 500)); 
		 
		 frame.getContentPane().add(sp); 
		 frame.setSize(700, 500);
		 frame.setVisible(true);
	}
}
	    
class CBM
{
	  static String title;

	  public CBM(String title) 
	  {
	    this.title = title;
	  }

	  public static String getTitle() 
	  {
	    return title;
	  }
}

class CBMCellRenderer 
implements TreeCellRenderer 
{
	  String titel;
	  JLabel titleLabel;
	  JPanel renderer;
	  DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
	  Color backgroundSelectionColor;
	  Color backgroundNonSelectionColor;

	  public CBMCellRenderer() 
	  {
		  renderer = new JPanel(new FlowLayout(FlowLayout.RIGHT,6,6));
		  titleLabel = new JLabel(" ");
		  titleLabel.setForeground(Color.blue);
		  titel=new String(CBM.getTitle());
		  renderer.add(new JButton(" "+titel));
		  backgroundSelectionColor = defaultRenderer.getBackgroundSelectionColor();
		  backgroundNonSelectionColor = defaultRenderer.getBackgroundNonSelectionColor();
	  }

	  public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) 
	  {
		  Component returnValue = null;
	    
		  if ((value != null) && (value instanceof DefaultMutableTreeNode)) 
		  {
			  Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
	      
			  if (userObject instanceof CBM) 
			  {
				  CBM book = (CBM) userObject;
				  titleLabel.setText(book.getTitle());
				  
				  if (selected) 
				  {
					  renderer.setBackground(backgroundSelectionColor);
				  } 
				  else 
				  {
					  renderer.setBackground(backgroundNonSelectionColor);
				  }
				  
				  renderer.setEnabled(tree.isEnabled());
				  returnValue = renderer;
			  }
		  }
		  
		  if (returnValue == null) 
		  {
			  returnValue = defaultRenderer.getTreeCellRendererComponent(tree,value, selected, expanded, leaf, row, hasFocus);
		  }
		  
		  return returnValue;
	  }
}

class NameVector 
extends Vector 
{
	  String name;

	  public NameVector(String name) 
	  {
	    this.name = name;
	  }

	  public NameVector(String name, Object elements[]) 
	  {
		  this.name = name;
		  for (int i = 0, n = elements.length; i < n; i++) 
		  {
			  add(elements[i]);
		  }
	  }

	  public String toString() 
	  {
		  return "[" + name + "]";
	  }
	}
```

jo mein Problem ist das mir immer nur das letzte Element angezeigt wird!! Bitte kannst du mir das ändern das der JTree so fuktioniert wie ich es gerne hätte weil es fehlt nicht mehr viel!!

_[Edit by Beni: Codetags]_


----------



## Wildcard (6. Jan 2007)

Ich hab nur die Sachen geändert die für die Lösung des Problems notwendig waren.
Irgendwie fehlt dir noch etwas der Plan... warum zum Beispiel war der 'title' von 'CBM' static?  :bahnhof: 

```
import java.awt.*;
import java.util.*;
import javax.swing.*; 
import javax.swing.tree.*;

public class jtree
{
   public static void main(String args[])
   {
      JFrame frame = new JFrame("CBM-Projekt");
      JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
      CBM Kassabuch[] = {
            new CBM("  Eintrag  "),
              new CBM("  Editieren  "),
              new CBM("  Löschen  "),
              new CBM("  Auflisten  "),
            new CBM("  Drucken  ") };
      
       CBM Kundenverwaltung[] = {
             new CBM("  Eintrag  "),
             new CBM("  Editieren  "),
             new CBM("  Löschen  "),
             new CBM("  Auflisten  "),
              new CBM("  Drucken  ") };
      
       CBM Administrator[] = {
             new CBM("  Einstellungen  "),
             new CBM("  Benutzer  "),
             new CBM("  Login/Logout  "),
             new CBM("  Informationen  ")};
      
       Vector KBVector = new NameVector("Kassabuch", Kassabuch);
       Vector KVVector = new NameVector("Kundenverwaltung", Kundenverwaltung);
       Vector ADVector = new NameVector("Administrator", Administrator);
       Object rootNodes[] = { KBVector, KVVector, ADVector };
       Vector rootVector = new NameVector("Root", rootNodes);
       JTree tree = new JTree(rootVector);
       TreeCellRenderer renderer = new CBMCellRenderer();
       tree.setCellRenderer(renderer);
       JScrollPane scroll = new JScrollPane(tree);
      
       JPanel lblPanel = new JPanel();
       lblPanel.add(new JLabel("Guten Tag Frau Fuchs!!"));
      
       sp.setLeftComponent(scroll);
       sp.setRightComponent(lblPanel);
      
       Dimension minimumSize = new Dimension(500, 500);
       scroll.setMinimumSize(minimumSize);
       lblPanel.setMinimumSize(minimumSize);
       sp.setDividerLocation(200);
       sp.setPreferredSize(new Dimension(700, 500));
      
       frame.getContentPane().add(sp);
       frame.setSize(700, 500);
       frame.setVisible(true);
   }
}
      
class CBM
{
     String title;

     public CBM(String title)
     {
       this.title = title;
     }

     public String getTitle()
     {
       return title;
     }
}

class CBMCellRenderer
implements TreeCellRenderer
{
     String titel;
     JLabel titleLabel;
     JPanel renderer;
     DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
     Color backgroundSelectionColor;
     Color backgroundNonSelectionColor;
     private JButton button;

     public CBMCellRenderer()
     {
        renderer = new JPanel(new FlowLayout(FlowLayout.RIGHT,6,6));
        titleLabel = new JLabel(" ");
        titleLabel.setForeground(Color.blue);
        button = new JButton();
        renderer.add(button);
        backgroundSelectionColor = defaultRenderer.getBackgroundSelectionColor();
        backgroundNonSelectionColor = defaultRenderer.getBackgroundNonSelectionColor();
     }

     public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
     {
        Component returnValue = null;
      
        if ((value != null) && (value instanceof DefaultMutableTreeNode))
        {
           Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
        
           if (userObject instanceof CBM)
           {
              CBM book = (CBM) userObject;
              button.setText(book.getTitle());
             
              if (selected)
              {
                 renderer.setBackground(backgroundSelectionColor);
              }
              else
              {
                 renderer.setBackground(backgroundNonSelectionColor);
              }
             
              renderer.setEnabled(tree.isEnabled());
              returnValue = renderer;
           }
        }
       
        if (returnValue == null)
        {
           returnValue = defaultRenderer.getTreeCellRendererComponent(tree,value, selected, expanded, leaf, row, hasFocus);
        }
       
        return returnValue;
     }
}

class NameVector
extends Vector
{
     String name;

     public NameVector(String name)
     {
       this.name = name;
     }

     public NameVector(String name, Object elements[])
     {
        this.name = name;
        for (int i = 0, n = elements.length; i < n; i++)
        {
           add(elements[i]);
        }
     }

     public String toString()
     {
        return "[" + name + "]";
     }
   }
```


----------



## Gast (6. Jan 2007)

Danke dir vielmals  nur wie können wir nun auf die Buttons reagieren Implementieren des ActionListeners im TreeCellRenderer? 
Danke


----------



## Wildcard (6. Jan 2007)

Das wird schwieriger.
Die Buttons sind nicht wirklich da, sondern werden nur gezeichnet.
Ich würde einen MouseListener auf dem Tree registrieren.


----------



## Gast (6. Jan 2007)

wie meinst du das genauer???

sollen wir dann auf Koordinaten abprüfen???





ajo noch was:
kann man statt dem Text Kassabuch/Kundenverwaltung/Administration auch Buttons verwenden????

lg und Thx im Voraus


----------



## Gast (8. Jan 2007)

so hier is mein neuer quellcode, wo ich bereits auf buttons reagieren kann, jedoch war es mir nicht möglich auch die roots mit buttons zu versehen und diese zu aktivieren, könntest du mir da bitte weiter helfen

import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.tree.*; 

public class jtree 
{ 
   public static void main(String args[]) 
   { 
      JFrame frame = new JFrame("CBM-Projekt"); 
      JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); 

      CBM Kassabuch[] = { 
            new CBM("  Kundeneintrag  "), 
            new CBM("  Kunden Editieren  "), 
            new CBM("  Kunden Löschen  "), 
            new CBM("  Kunden Auflisten  "), 
            new CBM("  Kunden Drucken  ") }; 

       CBM Kundenverwaltung[] = { 
             new CBM("  KB Eintrag  "), 
             new CBM("  KB Editieren  "), 
             new CBM("  KB Löschen  "), 
             new CBM("  KB Auflisten  "), 
             new CBM("  KB Drucken  ") }; 

       CBM Administrator[] = { 
             new CBM("  AD Einstellungen  "), 
             new CBM("  AD Benutzer  "), 
             new CBM("  AD Login/Logout  "), 
             new CBM("  AD Informationen  ")}; 

       Vector KBVector = new NameVector("Kassabuch", Kassabuch); 
       Vector KVVector = new NameVector("Kundenverwaltung", Kundenverwaltung); 
       Vector ADVector = new NameVector("Administrator", Administrator); 
       Object rootNodes[] = { KBVector, KVVector, ADVector }; 
       Vector rootVector = new NameVector("Root", rootNodes); 

       JTree tree = new JTree(rootVector); 
       TreeCellRenderer renderer = new CBMCellRenderer(); 
       tree.setCellRenderer(renderer);
       JScrollPane scroll = new JScrollPane(tree); 

       JPanel lblPanel = new JPanel(); 
       lblPanel.add(new JLabel("Guten Tag Frau Fuchs!!")); 

       sp.setLeftComponent(scroll); 
       sp.setRightComponent(lblPanel); 

       Dimension minimumSize = new Dimension(500, 500); 
       scroll.setMinimumSize(minimumSize); 
       lblPanel.setMinimumSize(minimumSize); 
       sp.setDividerLocation(200); 
       sp.setPreferredSize(new Dimension(700, 500)); 

       frame.getContentPane().add(sp); 
       frame.setSize(700, 500); 
       frame.setVisible(true); 
   } 
} 

class CBM 
{ 
     String title; 

     public CBM(String title) 
     { 
       this.title = title; 
     } 

     public String getTitle() 
     { 
       return title; 
     } 
} 

class CBMCellRenderer 
implements TreeCellRenderer 
{ 
     String titel; 
     JLabel titleLabel; 
     JPanel renderer; 
     DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer(); 
     Color backgroundSelectionColor; 
     Color backgroundNonSelectionColor; 
     private JButton button;
     private String react;

     public CBMCellRenderer() 
     { 
        renderer = new JPanel(new FlowLayout(FlowLayout.RIGHT,6,6)); 
        titleLabel = new JLabel(" "); 
        titleLabel.setForeground(Color.blue); 
        button = new JButton(); 
        renderer.add(button); 
        backgroundSelectionColor = defaultRenderer.getBackgroundSelectionColor(); 
        backgroundNonSelectionColor = defaultRenderer.getBackgroundNonSelectionColor(); 
     } 

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

        if ((value != null) && (value instanceof DefaultMutableTreeNode)) 
        { 
           Object userObject = ((DefaultMutableTreeNode) value).getUserObject(); 

           if (userObject instanceof CBM) 
           { 
              CBM book = (CBM) userObject; 
              button.setText(book.getTitle());
              react=book.getTitle();

              if (selected) 
              { 
                 renderer.setBackground(backgroundSelectionColor); 
                 //Hier kann jetzt auf die Buttons reagiert werden
                 if(react=="  Kundeneintrag  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  Kunden Editieren  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  Kunden Löschen  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  Kunden Auflisten  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  Kunden Drucken  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  KB Eintrag  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  KB Editieren  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  KB Löschen  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  KB Auflisten  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  KB Drucken  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  AD Einstellungen  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  AD Benutzer  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  AD Login/Logout  ")
                 {
                	 System.out.println(""+react);
                 }else if(react=="  AD Informationen  ")
                 {
                	 System.out.println(""+react);
                 }

              } 
              else 
              { 
                 renderer.setBackground(backgroundNonSelectionColor); 
              } 

              renderer.setEnabled(tree.isEnabled()); 
              returnValue = renderer; 
           } 
        } 

        if (returnValue == null) 
        { 
           returnValue = defaultRenderer.getTreeCellRendererComponent(tree,value, selected, expanded, leaf, row, hasFocus); 
        } 

        return returnValue; 
     } 
} 

class NameVector 
extends Vector 
{ 
     String name; 

     public NameVector(String name) 
     { 
       this.name = name; 
     } 

     public NameVector(String name, Object elements[]) 
     { 
        this.name = name; 
        for (int i = 0, n = elements.length; i < n; i++) 
        { 
           add(elements_); 
        } 
     } 

     public String toString() 
     { 
        return "[" + name + "]"; 
     } 
   }_


----------



## Wildcard (8. Jan 2007)

Gast hat gesagt.:
			
		

> so hier is mein neuer quellcode, wo ich bereits auf buttons reagieren kann, jedoch war es mir nicht möglich auch die roots mit buttons zu versehen und diese zu aktivieren, könntest du mir da bitte weiter helfen


Was genau meinst du damit, und benutz doch bitte in Zukunft Code-Tags!


----------



## Gast (8. Jan 2007)

ich meine wenn ich jetzt einen JTree habe wie zum Beispiel denn:

Kassabuch
    Button 1
    Button 2
    Button 3
    Button 4

Administrator
    Button 5
    Button 6

und momentan habe ich nur das die Kinder (childs) Buttons sind und i möchte aber noch das die Eltern (Kassabuch und Administrator) ebenfalls Buttons sind.


----------



## Wildcard (8. Jan 2007)

Dann pass deinen Renderer entsprechend an.


----------

