Schwierig: TreeNode und TreePath

Status
Nicht offen für weitere Antworten.
L

LarsKo

Gast
folgendes möchte ich erreichen.
mit den folgenden Fragmenten hampel ich nun schon einige Zeit herum und probiere dies an dem aus, wenn man einen new JTree() ohne irgendetwas erzeugt. Gut wir sehen ein paar Speisen und Farben und ich will nun, dass bei der aktuellen Selektion nicht das zuletzt selektierte Element auf der Konsole ausgegeben wird, sondern das vorletzte, egal ob Blatt oder Knoten!
Wenn ich also bananas anklicke, soll ravioli ausgegeben werden, wenn ich hot dogs anklicke, soll food ausgegeben werden. wie um himmels willen kriege ich das hin.??
Code:
TreePath path = tree.getSelectionPath();
System.out.println(path.getLastPathComponent());
TreeNode node = ((TreeNode)path.getLastPathComponent()).getParent();		
//hmmmm			
System.out.println(node);
Code:
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;


public class JTreeTest extends JFrame  {
	JPopupMenu pop;	
	JTree tree;
	TreePath clickedPath;

	public JTreeTest()	{

	 super("JTreeSelectionTest");	 
	 JPanel firstPanel = new JPanel();	      
	 tree = new JTree();		
	 tree.addMouseListener(new PopupTrigger());
	 firstPanel.add(tree);
		
	 getContentPane().add(firstPanel, BorderLayout.CENTER);
	 pack();		
	 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	 setVisible(true);
		
	}
	
	class PopupTrigger extends MouseAdapter 	{
		public void mouseReleased(MouseEvent e)		{
			
			TreePath path = tree.getSelectionPath();
			System.out.println(path.getLastPathComponent());
			TreeNode node = ((TreeNode)path.getLastPathComponent()).getParent();		
			
			//System.out.println(node);
		}
	}
	
	
	public static void main(String[] args) 	{		
		JTreeTest test = new JTreeTest();
	}
}
 

André Uhres

Top Contributor
Code:
   class PopupTrigger extends MouseAdapter    {
        public void mouseReleased(MouseEvent e)      {
            TreeNode node = getUpperNode( (TreeNode) tree.getLastSelectedPathComponent() );
            if(node != null){
                System.out.println(node);
            }
        }
    }
    private TreeNode getUpperNode(TreeNode node){
        TreeNode upperNode = null;
        try {
            TreeNode parent = node.getParent();
            int childIndex = parent.getIndex(node);
            if(childIndex == 0) {
                upperNode = parent;
            }else{
                upperNode = parent.getChildAt(childIndex-1);
            }
        } catch (NullPointerException e) {}
        return upperNode;
    }
 
L

LarsKo

Gast
ähhm , andre uhres ich hätte gerne privatunterricht. danke ;).
wenn ich jetzt noch wüßte wie man den selectionpath auf diesen vorgänger setzt wäre ich wieder glücklich.
 

Leroy42

Top Contributor
AlArenal hat gesagt.:
Mehrere returns sind aber auch Bad Style ;)

Ist das eigentlich so? :shock:

Ich bemühe mich auch immer eine Ein-Ausgang-Methode zu schreiben;
dennoch nervt mich der u.U. nötige zusätzliche Code (boolean-Variablen, ...)
 

AlArenal

Top Contributor
Emfpinde ich schon so, da man bei späteren Änderungen leicht mal ein return mittendrin überfährt und am Ende wundert man sich, warum da nicht rauskommt, was rauskommen soll. Im Debugger kann man auch nur schwer Variablen beobachten, die man gar nicht hat...
 

Illuvatar

Top Contributor
Ich finde, es kommt darauf an (wie immer eben) ;)

Sicherlich stimmt das, was AlArenal sagt, aber in gewisser Weise find ich ein return oftmals "logischer".
Ganz einfaches Beispiel:
Code:
public Foo getFoo(Bar bar)
{
  if (bar instanceof Foo){
    return bar;
  }
  Foobar x = //calculate something 
  return x;
}

Das könnte natürlich noch viel komplexer werden, außerdem kann das Nicht-return-verwenden auch manchmal zu tief verschachtelten ifs führen (und deshalb dann 20 Methoden zu extrahieren ist vielleicht auch nicht immer sinnvoll...)
 

André Uhres

Top Contributor
LarsKo hat gesagt.:
..wie man den selectionpath auf diesen vorgänger setzt ..
Code:
               DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
                TreeNode[] nodes = model.getPathToRoot(node);
                if( nodes != null ){
                    tree.setSelectionPath(new TreePath(nodes));
                }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I JavaFX Programmcode pausieren gestaltet sich als schwierig AWT, Swing, JavaFX & SWT 7
S Geclonter TreeNode besitzt selbes getUserObject Problem AWT, Swing, JavaFX & SWT 1
T JXTreeTable mit Klick auf TreeNode erweitern AWT, Swing, JavaFX & SWT 12
D TreeNode farbig markieren AWT, Swing, JavaFX & SWT 2
F Einzelne TreeNode an einem JTree editierbar machen AWT, Swing, JavaFX & SWT 3
F Rechte Maustaste auf TreeNode soll den Fokus auf diese setzen AWT, Swing, JavaFX & SWT 6
A Swing Drag and Drop TreeNode User Object AWT, Swing, JavaFX & SWT 3
A Text für TreeNode AWT, Swing, JavaFX & SWT 2
A TreeNode abgeleitet -> Wie komme ich an meine Methoden? AWT, Swing, JavaFX & SWT 2
W TreeNode einem DefaultMutableTreeNode zuweisen AWT, Swing, JavaFX & SWT 2
F Dateibaum mit TreeNode und JTree AWT, Swing, JavaFX & SWT 3
A ff. TreeNode Text ändern--> Problem: ... AWT, Swing, JavaFX & SWT 2
N Swing JTree TreePath zu Windows Pfad? AWT, Swing, JavaFX & SWT 2
N Swing TreePath Datei öffnen AWT, Swing, JavaFX & SWT 7
T Swing Wie kann ich einen String in ein TreePath umwandeln? AWT, Swing, JavaFX & SWT 5
G Prüfen ob ein Treepath existiert AWT, Swing, JavaFX & SWT 3
W cast von TreePath nach DefaultMutableTreeNode AWT, Swing, JavaFX & SWT 2
L TreePath eines Objektes innerhalb eines JTree ermitteln? AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen


Oben