Rootbuttons

Status
Nicht offen für weitere Antworten.

rooksvelt

Mitglied
hi leute!!

ich habe ein kleines problem nach längeren überlegungen und versuchen ist es mir dennoch nicht glungen im JTree bei den Eltern (root) Buttons zu machen. Ich schaffe es nur bei den Kindern.

Beispiel

root1
Button 1
Button 2
Button 3

root 2
Button 4

.
.
.
.

und ich möchte das jetzt der Root ebenfalls Buttons sind und nicht einfach eine Textzeile!

Ich stelle euch meinen Quellcode online vielleicht könnt ihr es Lösen.

Code:
package com.cbm.vis.util;

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

import com.cbm.util.CBMIConstant;
import com.cbm.vis.cashbook.CBM_KBEntry;
import com.cbm.vis.cashbook.CBM_KBList;
import com.cbm.vis.cashbook.CBM_KBSearch;
import com.cbm.vis.cmanagment.CBM_Customerentry;
import com.cbm.vis.cmanagment.CBM_Customerdelete;
import com.cbm.vis.main.CBMMain;

/****************************************************
 *  Name:    JTree mit Buttons                	  	*
 *  Author:  Thomas Rockenschaub              	  	*
 *  Date:    30.12.2006                           	*
 *  Modified Date: 5.1.2007							*	
 *  Version: 1.8 [Beta]                           	*
 *  ------------------------------------------------*
 *  Description: Tree um auf die diversen Funktion	*
 * 				 des Programms zugreifen zu können	*
 ***************************************************/

public class CBMJTree
implements CBMIConstant
{
	/* Konstante für die Größe des JTrees im Hauptfenster */
	private static final int m_sizex = 200;
	
	private CBM Kassabuch[] = {
            new CBM("  KB Eintrag  "),
            new CBM("  KB Editieren  "),
            new CBM("  KB Löschen  "),
            new CBM("  KB Auflisten  "),
            new CBM("  KB Drucken  ") };
     
     private CBM Kundenverwaltung[] = {
             new CBM("  Kundeneintrag  "),
             new CBM("  Kunden Editieren  "),
             new CBM("  Kunden Löschen  "),
             new CBM("  Kunden Auflisten  "),
             new CBM("  Kunden Drucken  ") };
     
     private CBM Administrator[] = {
             new CBM("  AD Einstellungen  "),
             new CBM("  AD Benutzer  "),
             new CBM("  AD Login/Logout  "),
             new CBM("  AD Informationen  ")};
     
     private Vector KBVector;
     private Vector KVVector;
     private Vector ADVector;
     private Vector rootVector;
     
     private JTree tree;
     private JScrollPane scroll;
     
   public CBMJTree()
   {
       KBVector = new NameVector("Kassabuch", Kassabuch);
       KVVector = new NameVector("Kundenverwaltung", Kundenverwaltung);
       ADVector = new NameVector("Administrator", Administrator);
       Object rootNodes[] = { KBVector, KVVector, ADVector };
       rootVector = new NameVector("Root", rootNodes);
       tree = new JTree(rootVector);
       TreeCellRenderer renderer = new CBMCellRenderer();
       tree.setCellRenderer(renderer);
       scroll = new JScrollPane(tree);
       scroll.setMinimumSize(new Dimension(m_sizex,m_fgry));
   }
   
   public Component getJScrollPane()
   {
	   return scroll;
   }
}
     
class CBM
{
     String title;

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

     public String getTitle()
     {
       return title;
     }
}

class CBMCellRenderer
implements TreeCellRenderer
{
     private JLabel titleLabel;
     private boolean choose=true;
     private int value1, value2;
     private JPanel renderer;
     private DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
     private Color backgroundSelectionColor;
     private 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);
                 String react = book.getTitle();
                  
            	 if(choose==false)
                 {
            		 if(react.equals("  KB Eintrag  "))
            			 value2=1;
            		 else if(react.equals("  KB Editieren  "))
            			 value2=2;
            		 else if(react.equals("  KB Löschen  "))
            			 value2=3;
            		 else if(react.equals("  KB Drucken  "))
            		 	 value2=4;
            		 else if(react.equals("  KB Auflisten  "))
           		 	 	 value2=5;
            		 else if(react.equals("  Kundeneintrag  "))
            			 value2=6;
            		 else if(react.equals("  Kunden Editieren  "))
            			 value2=7;
            		 else if(react.equals("  Kunden Löschen  "))
            			 value2=8;
            		 else if(react.equals("  Kunden Drucken  "))
            		 	 value2=9;
            		 else if(react.equals("  Kunden Auflisten  "))
           		 	 	 value2=10;
            		 else if(react.equals("  AD Einstellungen  "))
            			 value2=11;
            		 else if(react.equals("  AD Benutzer  "))
            			 value2=12;
            		 else if(react.equals("  AD Login/Logout  "))
            			 value2=13;
            		 else if(react.equals("  AD Informationen  "))
            		 	 value2=14;
            		 
            		 if(value1!=value2)
                		 choose=true; 
                 }
          
                 //Hier kann jetzt auf die Buttons reagiert werden 
                 if(choose==true)
                 {
                	 if(react.equals("  Kundeneintrag  ")) 
                	 {
                		 CBM_Customerentry Custentry=new CBM_Customerentry();
                		 CBMMain.setrightPanelComponent2(Custentry.getMainJPanel());
                		 CBMMain.setrightPanelComponent3(Custentry.getJButtonPanel());
                		 value1=6;
                		 choose=false;
                	 }else if(react.equals("  Kunden Editieren  ")) 
                	 { 
                		 System.out.println(""+react);
                		 value1=7;
                		 choose=false;
                	 }else if(react.equals("  Kunden Löschen  ")) 
                	 { 
                		 System.out.println(""+react); 
                		 CBM_Customerdelete Custdelete=new CBM_Customerdelete();
                		 CBMMain.setrightPanelComponent2(Custdelete.getMainJPanel());
                		 CBMMain.setrightPanelComponent3(Custdelete.getJButtonPanel());
                		 value1=8;
                		 choose=false;
                	 }else if(react.equals("  Kunden Auflisten  ")) 
                	 { 
                		 System.out.println(""+react);
                		 value1=10;
                		 choose=false;
                	 }else if(react.equals("  Kunden Drucken  ")) 
                	 { 
                		 System.out.println(""+react);
                		 value1=9;
                		 choose=false;
                	 }else if(react.equals("  KB Eintrag  ")) 
                	 { 
                		 System.out.println(""+react); 
                		 CBM_KBEntry entry=new CBM_KBEntry();
                		 CBMMain.setrightPanelComponent2(entry.getMainJPanel());
                		 CBMMain.setrightPanelComponent3(entry.getJButtonPanel());
                		 value1=1;
                		 choose=false;
                	 }else if(react.equals("  KB Editieren  ")) 
                	 { 
                		 System.out.println(""+react); 
                		 CBM_KBSearch entry=new CBM_KBSearch();
                		 CBMMain.setrightPanelComponent2(entry.getMainJPanel());
                		 CBMMain.setrightPanelComponent3(entry.getJButtonPanel());
                		 value1=2;
                		 choose=false;
                	 }else if(react.equals("  KB Löschen  ")) 
                	 {
                		 CBM_KBSearch entry=new CBM_KBSearch();
                		 CBMMain.setrightPanelComponent2(entry.getMainJPanel());
                		 CBMMain.setrightPanelComponent3(entry.getJButtonPanel());
                		 System.out.println(""+react);
                		 value1=3;
                		 choose=false;
                	 }else if(react.equals("  KB Auflisten  ")) 
                	 { 
                		 CBM_KBList entry=new CBM_KBList();
                		 CBMMain.setrightPanelComponent2(entry.getMainJPanel());
                		 //CBMMain.setrightPanelComponent3(entry.getJButtonPanel());
                		 System.out.println(""+react);
                		 value1=5;
                		 choose=false;
                	 }else if(react.equals("  KB Drucken  ")) 
                	 { 
                		 System.out.println(""+react);
                		 value1=4;
                		 choose=false;
                	 }else if(react.equals("  AD Einstellungen  ")) 
                	 { 
                		 System.out.println(""+react);
                		 value1=11;
                		 choose=false;
                	 }else if(react.equals("  AD Benutzer  ")) 
                	 { 
                		 System.out.println(""+react);
                		 value1=12;
                		 choose=false;
                	 }else if(react.equals("  AD Login/Logout  ")) 
                	 { 
                		 System.out.println(""+react);
                		 value1=13;
                		 choose=false;
                	 }else if(react.equals("  AD Informationen  ")) 
                	 { 
                		 System.out.println(""+react);
                		 value1=14;
                		 choose=false;
                	 } 
                 }
              }
              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
{
	private static final long serialVersionUID = 1L;
	
	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 + "]";
     }
   }
 
B

Beni

Gast
Oj, ich sehe den Fehler nicht. Aber mach doch mal einen Breakpoint in deiner "getTreeCellRenderer"-Methode, starte dein Programm mit einem Debugger, und schau, welche Werte für "value" da benutzt werden. Ein paar geschickt platzierte "System.out.println( ... )", die z.B. "value" ausdrucken, könnten auch schon viele Informationen geben.

Allenfalls lohnt es sich auch "NameVector" z.B. von einem DefaultMutableTreeNode erben zu lassen (die Vector-Funktionalitäten müssen halt ein bisschen versteckt werden), dann kannst du sicher sein, dass der Tree die Elemente nicht in irgendwelchen eigenen Knoten-Objekten "versteckt".
 

rooksvelt

Mitglied
Buh, ich habe schon alles versucht das der root ebenfalls ein Button wird aber leider vergebens!!

Könntest es du vielleicht bitte einmal versuchen??
 
B

Beni

Gast
Wie der Debugger (nach wenigen Sekunden *hust* ) zeigt, ist das "userObject" für die Roots ein NameVector:
forum_075.png


Da deine Methode den NameVector nicht bearbeitet, benutzt sie den "defaultRenderer" um eine Component zu kriegen - und der liefert halt kein Button.

Da ich dein Programm nicht ganz durchschaue, kann ich dir nicht genau sagen, wie du das reparieren musst. Jedenfalls muss die zusätzliche Behandlung vom NameVector noch rein...
 

rooksvelt

Mitglied
ich stelle dir die einfache version meines programmes online!!
der quellcode den ich dir online gestellt hatte ist bereits in ein projekt eingearbeitet und darum sehr schwer zu verstehen!!
 

rooksvelt

Mitglied
hier de vereinfachte code!

Code:
package com.cbm.vis.util;

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

public class CBMJTree
implements CBMIConstant
{
	/* Konstante für die Größe des JTrees im Hauptfenster */
	private static final int m_sizex = 200;
	
	private CBM Kassabuch[] = {
            new CBM("  KB Eintrag     "),
            new CBM("  KB Editieren  "),
            new CBM("  KB Löschen  "),
            new CBM("  KB Auflisten  "),
            new CBM("  KB Drucken   ") };
     
     private CBM Kundenverwaltung[] = {
             new CBM("  Kundeneintrag      "),
             new CBM("  Kunden Editieren  "),
             new CBM("  Kunden Löschen  "),
             new CBM("  Kunden Auflisten  "),
             new CBM("  Kunden Drucken   ") };
     
     private CBM Administrator[] = {
             new CBM("  AD Einstellungen "),
             new CBM("  AD Benutzer          "),
             new CBM("  AD Login/Logout   "),
             new CBM("  AD Informationen ")};
     
     private Vector KBVector;
     private Vector KVVector;
     private Vector ADVector;
     private Vector rootVector;
     
     private JTree tree;
     private JScrollPane scroll;
     
   public CBMJTree()
   {
       KBVector = new NameVector("Kassabuch", Kassabuch);
       KVVector = new NameVector("Kundenverwaltung", Kundenverwaltung);
       ADVector = new NameVector("Administrator", Administrator);
       Object rootNodes[] = { KBVector, KVVector, ADVector };
       rootVector = new NameVector("Root", rootNodes);
       tree = new JTree(rootVector);
       TreeCellRenderer renderer = new CBMCellRenderer();
       tree.setCellRenderer(renderer);
       scroll = new JScrollPane(tree);
       scroll.setMinimumSize(new Dimension(m_sizex,m_fgry));
   }
   
   public Component getJScrollPane()
   {
	   return scroll;
   }
}
     
class CBM
{
     String title;

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

     public String getTitle()
     {
       return title;
     }
}

class CBMCellRenderer
implements TreeCellRenderer
{
     private JLabel titleLabel;
     private int value1, value2;
     private JPanel renderer;
     private DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
     private Color backgroundSelectionColor;
     private 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);
                 String react = book.getTitle();
              
            		                  
                 //Hier kann jetzt auf die Buttons reagiert werden 

                               	 if(react.equals("  Kundeneintrag      ")) 
                	 {
                		 System.out.println(""+react);
                	 }else if(react.equals("  Kunden Editieren  ")) 
                	 { 
                		 System.out.println(""+react); 
                	 }else if(react.equals("  Kunden Löschen  ")) 
                	 { 
                		 System.out.println(""+react); 
                	 }else if(react.equals("  Kunden Auflisten  ")) 
                	 { 
                		 System.out.println(""+react);
                	 }else if(react.equals("  Kunden Drucken   ")) 
                	 { 
                		 System.out.println(""+react);
                	 }else if(react.equals("  KB Eintrag     ")) 
                	 { 
                		 System.out.println(""+react); 
                	 }else if(react.equals("  KB Editieren  ")) 
                	 { 
                		 System.out.println(""+react); 
                	 }else if(react.equals("  KB Löschen  ")) 
                	 {
                		 System.out.println(""+react);
                	 }else if(react.equals("  KB Auflisten  ")) 
                	 { 
                		 System.out.println(""+react);
                	 }else if(react.equals("  KB Drucken   ")) 
                	 { 
                		 System.out.println(""+react);
                	 }else if(react.equals("  AD Einstellungen ")) 
                	 { 
                		 System.out.println(""+react);
                	 }else if(react.equals("  AD Benutzer            ")) 
                	 { 
                		 System.out.println(""+react);
                	 }else if(react.equals("  AD Login/Logout   ")) 
                	 { 
                		 System.out.println(""+react);
                	 }else if(react.equals("  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
{
	private static final long serialVersionUID = 1L;
	
	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 + "]";
     }
   }

vielleicht kannst du bitte das Problem beheben!
 
B

Beni

Gast
vielleicht kannst du bitte das Problem beheben!
Öh, nö, ich hab dir ein paar Tipps uns Anhaltspunkte gegeben was fehlt, aber deine Arbeit mach ich nicht :wink:
Ich weiss ja auch garnicht wie auf ein NameVector reagiert werden soll, du bastelst da irgendetwas mit "Book" und "getTitle" das ich überhaubt nicht nachvollziehen kann :arrow: der Aufwand für mich wäre grösser als für dich wenn du das selbst machst.
Du hast doch schon den ganzen Rest geschrieben, dann sollte das für dich wirklich kein Problem sein. ???:L ... irgendwas mit
Code:
if( userObject instanceof NameVector ){
  String name = ((NameVector)userObject).getName();
  button.setText( name );
  returnValue = renderer;

  ... und was du sonst alles setzen willst, Farben, enabled, ...
 
Status
Nicht offen für weitere Antworten.

Oben