Hihu,
ich hab ein Problem.
Hab eine JTree gebastelt,
möchte folgende Funktion implementieren:
Sobald man einen Knoten anklickt,
sollen alle Blätter darunter ausgewählt (selektiert) werden.
Notiz:
- Den cast-operator wusste ich nicht zu vermeiden.
- Die Variable t ist mein JTree
- Ich entferne die Markierung zum Schluss,
damit ich den Knoten erneut anklicken kann.
Mein Ansatz:
die Methode selectTree(tmpN) soll den Rest des Baums selektieren:
Wenn ein Knoten wieder selektiert würde,
dann soll erneut der Event-Listener anschlagen.
Manchmal geht es,
ein anderer mal kommt dann:
GEKÜRZTE
Warum kommt gerade ein "StackOverflow" ?
Ich bin am Verzweifeln,
gibt es vielleicht einen besseren Ansatz?
ich hab ein Problem.
Hab eine JTree gebastelt,
möchte folgende Funktion implementieren:
Sobald man einen Knoten anklickt,
sollen alle Blätter darunter ausgewählt (selektiert) werden.
Notiz:
- Den cast-operator wusste ich nicht zu vermeiden.
- Die Variable t ist mein JTree
- Ich entferne die Markierung zum Schluss,
damit ich den Knoten erneut anklicken kann.
Mein Ansatz:
Code:
t.addTreeSelectionListener(new TreeSelectionListener()
{
public void valueChanged(TreeSelectionEvent event)
{
if(event.getNewLeadSelectionPath().getLastPathComponent() instanceof DefaultMutableTreeNode)
{
TreePath tmpP = event.getNewLeadSelectionPath();
DefaultMutableTreeNode tmpN = (DefaultMutableTreeNode) tmpP.getLastPathComponent();
//wenn es ein Knoten ist
if(!tmpN.isLeaf())
{
//und gerade markiert wurde
boolean select = t.getSelectionModel().isPathSelected(tmpP);
if(select)
{
//markiere Rest
selectTree(tmpN);
t.removeSelectionPath(tmpP);
}
}
}
}
});
die Methode selectTree(tmpN) soll den Rest des Baums selektieren:
Code:
private void selectTree(DefaultMutableTreeNode node)
{
DefaultMutableTreeNode tmpNode = null;
//gehe alle Kinder durch
for(int i = 0; i < node.getChildCount(); i++)
{
tmpNode = (DefaultMutableTreeNode) node.getChildAt(i);
System.out.println(tmpNode);
//auswählen
this.t.addSelectionPath( new TreePath(tmpNode.getPath()) );
}
}
Wenn ein Knoten wieder selektiert würde,
dann soll erneut der Event-Listener anschlagen.
Manchmal geht es,
ein anderer mal kommt dann:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at sun.nio.cs.SingleByteEncoder.encodeArrayLoop(SingleByteEncoder.java:91)
at sun.nio.cs.SingleByteEncoder.encodeLoop(SingleByteEncoder.java:130)
at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544)
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111)
at java.io.PrintStream.write(PrintStream.java:476)
at java.io.PrintStream.print(PrintStream.java:619)
at java.io.PrintStream.println(PrintStream.java:773)
at SelectPanel.selectTree(SelectPanel.java:179)
at SelectPanel.access$100(SelectPanel.java:20)
at SelectPanel$1.valueChanged(SelectPanel.java:89)
at javax.swing.JTree.fireValueChanged(JTree.java:2823)
at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3194)
at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629)
at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078)
at javax.swing.tree.DefaultTreeSelectionModel.addSelectionPaths(DefaultTreeSelectionModel.java:406)
at javax.swing.tree.DefaultTreeSelectionModel.addSelectionPath(DefaultTreeSelectionModel.java:303)
at javax.swing.JTree.addSelectionPath(JTree.java:1701)
at SelectPanel.selectTree(SelectPanel.java:181)
at SelectPanel.access$100(SelectPanel.java:20)
at SelectPanel$1.valueChanged(SelectPanel.java:89)
at javax.swing.JTree.fireValueChanged(JTree.java:2823)
at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3194)
at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629)
at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078)
at javax.swing.tree.DefaultTreeSelectionModel.removeSelectionPaths(DefaultTreeSelectionModel.java:497)
at javax.swing.tree.DefaultTreeSelectionModel.removeSelectionPath(DefaultTreeSelectionModel.java:427)
at javax.swing.JTree.removeSelectionPath(JTree.java:2510)
at SelectPanel$1.valueChanged(SelectPanel.java:90)
at javax.swing.JTree.fireValueChanged(JTree.java:2823)
at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3194)
at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629)
at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078)
at javax.swing.tree.DefaultTreeSelectionModel.addSelectionPaths(DefaultTreeSelectionModel.java:406)
at javax.swing.tree.DefaultTreeSelectionModel.addSelectionPath(DefaultTreeSelectionModel.java:303)
at javax.swing.JTree.addSelectionPath(JTree.java:1701)
at SelectPanel.selectTree(SelectPanel.java:181)
at SelectPanel.access$100(SelectPanel.java:20)
at SelectPanel$1.valueChanged(SelectPanel.java:89)
at javax.swing.JTree.fireValueChanged(JTree.java:2823)
[...]
Warum kommt gerade ein "StackOverflow" ?
Ich bin am Verzweifeln,
gibt es vielleicht einen besseren Ansatz?