K
K aus W
Gast
Guten Tag zusammen,
Momentan kämpfe ich seit geraumer Weile an einem Problem mit dem JTree herum. Den Source-Code für das Problem habe ich angehängt.
Mein Ziel für ein Projekt ist es in einem JTree für die tiefsten Ebenen JCheckboxen zu benutzen. Diese können angeklickt werden und das Objekt wird in der ausgewählten Unterkategorie gespeichert. Dies funktioniert soweit, das Hauptaugenmerkt für mein Problem liegt aber im JTree, da gibt es einige Probleme:
1. Die Checkboxen verhalten sich nicht wie normale Checkboxen
2. Eine selektierte Checkbox lässt sich nicht mehr deselektieren
3. Ist ein Objekt in dieser Unterkategorie abgespeichert und von Anfang an automatisch als selektierter Element implementiert, kann diese nicht deselektiert werden.
--> Siehe Beispiel mit Unterkategorie 2
4. Mehrfachauswahl der Checkboxen ist nur noch mit gedrückter "Ctrl"-Taste möglich
Können diese Probleme irgendwie gelöst werden? Mir fällt dazu leider nichts mehr ein.
Für einen Direktvergleich, wie sich JCheckboxen eigentlich verhalten sollten, habe ich ein weiteres Fenster programmiert.
Ich hoffe, dass ich die Probleme klar erläutern konnte, ansonsten dürfte der Source-Code für das Verständniss ausschlaggebend sein.
Liebe Grüsse,
K aus W
Momentan kämpfe ich seit geraumer Weile an einem Problem mit dem JTree herum. Den Source-Code für das Problem habe ich angehängt.
Mein Ziel für ein Projekt ist es in einem JTree für die tiefsten Ebenen JCheckboxen zu benutzen. Diese können angeklickt werden und das Objekt wird in der ausgewählten Unterkategorie gespeichert. Dies funktioniert soweit, das Hauptaugenmerkt für mein Problem liegt aber im JTree, da gibt es einige Probleme:
1. Die Checkboxen verhalten sich nicht wie normale Checkboxen
2. Eine selektierte Checkbox lässt sich nicht mehr deselektieren
3. Ist ein Objekt in dieser Unterkategorie abgespeichert und von Anfang an automatisch als selektierter Element implementiert, kann diese nicht deselektiert werden.
--> Siehe Beispiel mit Unterkategorie 2
4. Mehrfachauswahl der Checkboxen ist nur noch mit gedrückter "Ctrl"-Taste möglich
Können diese Probleme irgendwie gelöst werden? Mir fällt dazu leider nichts mehr ein.
Für einen Direktvergleich, wie sich JCheckboxen eigentlich verhalten sollten, habe ich ein weiteres Fenster programmiert.
Ich hoffe, dass ich die Probleme klar erläutern konnte, ansonsten dürfte der Source-Code für das Verständniss ausschlaggebend sein.
Liebe Grüsse,
K aus W
Java:
package test;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeCellRenderer;
/**
* Test-Klasse
*/
public class TreeCheckboxTest extends JFrame{
/** **/ private static final long serialVersionUID = 1L;
/**
* @param args
*/
public static void main(String[] args) {
TreeCheckboxTest checkboxen = new TreeCheckboxTest(5);
checkboxen.setVisible(true);
checkboxen.setSize(300, 300);
TreeCheckboxTest tree = new TreeCheckboxTest();
tree.setVisible(true);
tree.setSize(300, 300);
}
/**
* Konstruktor für JFrame mit JCheckboxen
* @param anzahlCheckboxen
*/
public TreeCheckboxTest(int anzahlCheckboxen){
JPanel main = new JPanel(new GridLayout(anzahlCheckboxen, 1));
for(int checkBoxen = 0; checkBoxen < anzahlCheckboxen; checkBoxen++){
main.add(new JCheckBox("Checkbox " + checkBoxen));
}
this.add(main);
this.setTitle("Checkbox-Test");
}
/**
* Konstruktor für JFrame mit JTree und JCheckboxen
*/
public TreeCheckboxTest() {
JPanel main = new JPanel(new BorderLayout());
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Root");
DefaultMutableTreeNode kategorieNode1 = new DefaultMutableTreeNode("Kategorie 1");
DefaultMutableTreeNode kategorieNode2 = new DefaultMutableTreeNode("Kategorie 2");
DefaultMutableTreeNode unterkategorieNode1 = new DefaultMutableTreeNode("Unterkategorie 1");
DefaultMutableTreeNode unterkategorieNode2 = new DefaultMutableTreeNode("Unterkategorie 2");
DefaultMutableTreeNode unterkategorieNode3 = new DefaultMutableTreeNode("Unterkategorie 3");
DefaultMutableTreeNode unterkategorieNode4 = new DefaultMutableTreeNode("Unterkategorie 4");
kategorieNode1.add(unterkategorieNode1);
kategorieNode1.add(unterkategorieNode2);
kategorieNode1.add(unterkategorieNode3);
kategorieNode2.add(unterkategorieNode4);
rootNode.add(kategorieNode1);
rootNode.add(kategorieNode2);
JTree tree = new JTree(rootNode);
tree.setCellRenderer(new TreeRenderer());
main.add(tree);
this.add(main);
this.setTitle("Checkbox JTree");
}
/**
* TreeRenderer-Klasse
*/
public class TreeRenderer implements TreeCellRenderer{
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value;
if(treeNode.getUserObject().toString().contains("Root")){
JLabel lbl = new JLabel(treeNode.getUserObject().toString());
lbl.setBackground(Color.WHITE);
return lbl;
}else if(treeNode.getUserObject().toString().contains("Kategorie")){
JLabel lbl = new JLabel(treeNode.getUserObject().toString());
lbl.setBackground(Color.WHITE);
return lbl;
}else{
JCheckBox checkb = new JCheckBox(treeNode.getUserObject().toString());
checkb.setBackground(Color.WHITE);
checkb.setSelected(selected);
if(treeNode.getUserObject().toString().equals("Unterkategorie 2")){
checkb.setSelected(true);
}
return checkb;
}
}
}
}