Class CheckBoxTree

java.lang.Object
java.awt.event.MouseAdapter
de.bsvrz.pat.sysbed.dataview.filtering.CheckBoxTree
All Implemented Interfaces:
java.awt.event.MouseListener, java.awt.event.MouseMotionListener, java.awt.event.MouseWheelListener, java.util.EventListener, javax.swing.event.TreeSelectionListener

public class CheckBoxTree
extends java.awt.event.MouseAdapter
implements javax.swing.event.TreeSelectionListener
CheckBoxTree dekoriert einen JTree mit je einer JCheckBox pro Knoten bzw. Blatt. Dabei übernimmt CheckBoxTree den Renderer der Original-JTree-Objekts und gegebenenfalls auch einen Editor. Das Interface CheckBoxListener dient dazu, bei Zustandsänderung einer JCheckBox registrierte Listener davon zu unterrichten.

CheckBoxTree basiert der Idee und zum Teil auch dem Code nach auf einem Artikel von Santhosh Kumar Tekuri, vgl. http://www.jroller.com/page/santhosh/20050610. Dieser Code wurde später von seinem Autor unter LGPL 2.1 oder höher (nach Wahl des Benutzers) lizensiert. CheckBoxTree heißt dort CheckTreeManager. Dort wurde nur der Renderer 'gewrapped'. Statt dem dort verwendeten, komplexen Selektions-Model für die Zustände der Check-Boxen, welches mit einer 3-Zustände-Check-Box interagiert, kommt hier ein DefaultTreeSelectionModel zum Einsatz.

Anwendung: eine typische Anwendung besteht aus ein bis vier Zeilen Code:

              CheckTreeManager manager = new CheckTreeManager(tree, aCheckBoxInitializer);
              manager.setLeafsOnly(true);
              manager.suppressIcons();
              manager.addCheckBoxListener(aListener);
  
Da der CheckBoxTree keine Component ist, wird nicht er, sondern der dekorierte JTree in Container gesteckt.

Einschränkungen: (1) Im Konstruktor von CheckBoxTree wird der TreeCellRenderer und gegebenfalls der TreeCellEditor des übergebenen JTrees durch einen speziellen Wrapper-Renderer und eine speziellen Wrapper-Editor ersetzt, die gewisse Aufgaben selber übernehmen, aber andere an ihre Vorgänger deliegieren. Dementsprechend sind die Methoden JTree.setCellRenderer und JTree.setCellEditor nach dem Konstruktor-Aufruf tabu. (2) Der Original-Renderer des übergebenen JTrees sollte - um vollen Funktionsunfang zu haben - ein DefaultTreeCellRenderer sein oder einer Subklasse davon angehören (s. ignoreIcons). (3) Eine ähnliche Einschränkung gilt für das TableModel des JTrees: ist dies ein DefaultTableModel oder davon abgeleitet, so wird der Knoten aktualisiert, wenn seine Check-Box betätigt wird (s. DefaultTableModel.reload(TreeNode)). Dadurch wird eine eventuell vorhandene Veränderung der Darstellung automatisch durchgeführt.

Besonderheit: CheckBoxTree bietet dem Benutzer die Möglichkeit, jederzeit die Checkboxen erneut zu initialisieren. Hierzu wird reinitializeCheckBoxes aufgerufen. Diese Methode benutzt den im Konstruktor angegebenen Initialisierer. Damit steht dem Benutzer auch programmatisch die Möglichlkeit zu, die CheckBoxen nach der Konstruktion zu steuern.

  • Nested Class Summary

    Nested Classes
    Modifier and Type Class Description
    static interface  CheckBoxTree.CheckBoxInitializer  
  • Constructor Summary

    Constructors
    Constructor Description
    CheckBoxTree​(javax.swing.JTree tree, CheckBoxTree.CheckBoxInitializer initializer)
    Der Konstruktor.
  • Method Summary

    Modifier and Type Method Description
    void addCheckBoxListener​(de.bsvrz.pat.sysbed.dataview.filtering.CheckBoxTree.CheckBoxListener l)
    Registriert einen CheckBoxListener.
    void mousePressed​(java.awt.event.MouseEvent e)
    Während das Selektionsverhalten dem JTree überlassen bleibt, wird das Betätigen der Check-Boxen hier im MouseListener abgearbeitet.
    void reinitializeCheckBoxes()
    Diese Methode dient dazu, die CheckBoxen zu jeden beliebeigen Zeitpunkt neu initialisieren zu können.
    boolean removeCheckBoxListener​(de.bsvrz.pat.sysbed.dataview.filtering.CheckBoxTree.CheckBoxListener l)
    De-registriert einen CheckBoxListener und gibt im Erfolgsfall true zurück.
    void setLeafsOnly​(boolean leafsOnly)
    Im Defaultzustand wird jeder Knoten mit einer JCheckBox dekoriert.
    void suppressIcons()
    Nach dem Ausführen dieser Methode werden die üblichen Icons (für geöffnete und geschlossene Knoten, sowie Blätter) unterdrückt.
    java.lang.String toString()  
    void valueChanged​(javax.swing.event.TreeSelectionEvent e)  

    Methods inherited from class java.awt.event.MouseAdapter

    mouseClicked, mouseDragged, mouseEntered, mouseExited, mouseMoved, mouseReleased, mouseWheelMoved

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • Constructor Details

    • CheckBoxTree

      public CheckBoxTree​(javax.swing.JTree tree, @Nullable CheckBoxTree.CheckBoxInitializer initializer)
      Der Konstruktor. Er benötigt einen JTree und ihm kann auch ein CheckBoxInitializer mitgegeben werden. Geschieht dies nicht, so werden alle Check-Boxen unselektiert initialisiert.
      Parameters:
      tree - ein JTree
      initializer - ein CheckBoxInitializer oder null
  • Method Details

    • reinitializeCheckBoxes

      public void reinitializeCheckBoxes()
      Diese Methode dient dazu, die CheckBoxen zu jeden beliebeigen Zeitpunkt neu initialisieren zu können.
    • setLeafsOnly

      public void setLeafsOnly​(boolean leafsOnly)
      Im Defaultzustand wird jeder Knoten mit einer JCheckBox dekoriert. Mit dieser Methode kann man dies auf alle Blätter einschränken und auch wieder rückgängig machen.
      Parameters:
      leafsOnly - ein Boolean
    • suppressIcons

      public void suppressIcons()
      Nach dem Ausführen dieser Methode werden die üblichen Icons (für geöffnete und geschlossene Knoten, sowie Blätter) unterdrückt. Diese Funktionalität steht nur für dann zur Verfügung, wenn der Original-Renderer ein DefaultTreeCellRenderer ist.
    • addCheckBoxListener

      public void addCheckBoxListener​(de.bsvrz.pat.sysbed.dataview.filtering.CheckBoxTree.CheckBoxListener l)
      Registriert einen CheckBoxListener.
      Parameters:
      l - ein Listener
    • removeCheckBoxListener

      public boolean removeCheckBoxListener​(de.bsvrz.pat.sysbed.dataview.filtering.CheckBoxTree.CheckBoxListener l)
      De-registriert einen CheckBoxListener und gibt im Erfolgsfall true zurück.
      Parameters:
      l - ein Listener
      Returns:
      der Erfolgswert
    • mousePressed

      public void mousePressed​(java.awt.event.MouseEvent e)
      Während das Selektionsverhalten dem JTree überlassen bleibt, wird das Betätigen der Check-Boxen hier im MouseListener abgearbeitet.
      Specified by:
      mousePressed in interface java.awt.event.MouseListener
      Overrides:
      mousePressed in class java.awt.event.MouseAdapter
      Parameters:
      e - ein Maus-Event
    • valueChanged

      public void valueChanged​(javax.swing.event.TreeSelectionEvent e)
      Specified by:
      valueChanged in interface javax.swing.event.TreeSelectionListener
    • toString

      public java.lang.String toString()
      Overrides:
      toString in class java.lang.Object