This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
swing:tree [2015/05/17 17:36] gthanos [Δημιουργία του δένδρου] |
swing:tree [2015/05/18 03:40] gthanos [Ανταποκρινόμενοι στα events ενός δένδρου] |
||
---|---|---|---|
Line 33: | Line 33: | ||
</code> | </code> | ||
- | Από τις παραπάνω μεθόδους είναι προφανές ότι σε ένα κόμβο μπορείτε να προσθέσετε άλλους κόμβους ή να αφαιρέσετε κόμβους ή να μετακινήσετε κόμβους. Ένας απλός τρόπος ώστε οι κόβμοι σας να υλοποιούν το συγκεκριμένο interface είναι να ανήκουν στην κλάση [[http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/DefaultMutableTreeNode.html|DefaultMutableTreeNode]] που υλοποιεί το συγκεκριμένο interface. | + | Από τις παραπάνω μεθόδους είναι προφανές ότι σε ένα κόμβο μπορείτε να προσθέσετε άλλους κόμβους ή να αφαιρέσετε κόμβους ή να μετακινήσετε κόμβους. Ένας απλός τρόπος ώστε οι κόμβοι σας να υλοποιούν το συγκεκριμένο interface είναι να ανήκουν στην κλάση [[http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/DefaultMutableTreeNode.html|DefaultMutableTreeNode]] που υλοποιεί το συγκεκριμένο interface. Η κλάση αυτή περιέχει πολλές βοηθητικές μεθόδους οι οποίες σας βοηθούν να πλοηγηθείτε στο δένδρο όταν το χρειαστείτε. Παρακάτω δίνεται ο κώδικας που δημιουργεί το δένδρο. |
- | Παρακάτω δίνεται ο κώδικας που δημιουργεί το δένδρο. | ||
<code java> | <code java> | ||
DefaultMutableTreeNode top = | DefaultMutableTreeNode top = | ||
Line 48: | Line 47: | ||
</code> | </code> | ||
- | Ο παραπάνω κώδικας δημιουργεί το στοιχείο της ρίζας με τον όνομα //top// και με βάση αυτό δημιουργεί και τα υπόλοιπα αντικείμενα μέσω της μεθόδου //void createNodes(DefaultMutableTreeNode top)//. Στην συνέχεια, δημιουργεί το δένδρο στο οποίο ορίζει ως ρίζα το στοχείο //top//. Επίσης, ορίζει ότι το δένδρο μπορεί να μεταβληθεί από τον χρήστη και ορίζει ότι μόνο ένας κόμβος του δένδρου μπορεί να επιλεγεί από τον χρήστη κάθε φορά. | + | Ο παραπάνω κώδικας δημιουργεί το στοιχείο της ρίζας με τον όνομα //top// και με βάση αυτό δημιουργεί και τα υπόλοιπα αντικείμενα μέσω της μεθόδου ''void createNodes(DefaultMutableTreeNode top)''. Στην συνέχεια, δημιουργεί το δένδρο στο οποίο ορίζει ως ρίζα το στοχείο //top//. Επίσης, ορίζει ότι το δένδρο μπορεί να μεταβληθεί από τον χρήστη και ορίζει ότι μόνο ένας κόμβος του δένδρου μπορεί να επιλεγεί από τον χρήστη κάθε φορά. |
<code java> | <code java> | ||
tree.setEditable(true); | tree.setEditable(true); | ||
tree.getSelectionModel().setSelectionMode | tree.getSelectionModel().setSelectionMode | ||
(TreeSelectionModel.SINGLE_TREE_SELECTION); | (TreeSelectionModel.SINGLE_TREE_SELECTION); | ||
+ | </code> | ||
+ | |||
+ | Οι επιλογές που έχετε αναφορικά με τον αριθμό των κόμβων που μπορείτε να επιλέξετε είναι οι παρακάτω: | ||
+ | <code java> | ||
+ | static int CONTIGUOUS_TREE_SELECTION | ||
+ | //Πολλαπλοί συνεχόμενοι κόμβοι | ||
+ | static int DISCONTIGUOUS_TREE_SELECTION | ||
+ | //Πολλαπλοί κόμβοι, όχι απαραίτητα συνεχόμενοι | ||
+ | static int SINGLE_TREE_SELECTION | ||
+ | //Μόνο ένας κόμβος μπορεί να επιλεγεί κάθε φορά. | ||
+ | </code> | ||
+ | |||
+ | Παρακάτω δίνεται ένα τμήμα της μεθόδου //createNodes//. | ||
+ | <code java> | ||
+ | private void createNodes(DefaultMutableTreeNode top) { | ||
+ | DefaultMutableTreeNode category = null; | ||
+ | DefaultMutableTreeNode book = null; | ||
+ | |||
+ | category = new DefaultMutableTreeNode("Books for Java Programmers"); | ||
+ | top.add(category); | ||
+ | |||
+ | //original Tutorial | ||
+ | book = new DefaultMutableTreeNode(new BookInfo | ||
+ | ("The Java Tutorial: A Short Course on the Basics", | ||
+ | "tutorial.html")); | ||
+ | category.add(book); | ||
+ | |||
+ | //Tutorial Continued | ||
+ | book = new DefaultMutableTreeNode(new BookInfo | ||
+ | ("The Java Tutorial Continued: The Rest of the JDK", | ||
+ | "tutorialcont.html")); | ||
+ | category.add(book); | ||
+ | |||
+ | //JFC Swing Tutorial | ||
+ | book = new DefaultMutableTreeNode(new BookInfo | ||
+ | ("The JFC Swing Tutorial: A Guide to Constructing GUIs", | ||
+ | "swingtutorial.html")); | ||
+ | category.add(book); | ||
+ | | ||
+ | .... | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Από τον παρακάτω κατασκευαστή της κλάσης [[http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/DefaultMutableTreeNode.html|DefaultMutableTreeNode]] παρατηρούμε ότι κατά την δημιουργία αντικειμένων της κλάσης αυτής μπορούμε να αποθηκεύσουμε οποιοδήποτε αντικείμενο μέσα σε αυτή. | ||
+ | <code java> | ||
+ | public DefaultMutableTreeNode(Object userObject); | ||
+ | </code> | ||
+ | Έτσι στη μέθοδο createNodes αποθηκεύονται Strings, αν πρόκειται για κόμβους που αναφέρονται στις κατηγορίες των βιβλίων ή αντικείμενα της κλάσης //BookInfo// αν πρόκειται για βιβλία. Αντίστοιχα, αν θέλετε να λάβετε το περιεχόμενο ενός κόμβου μπορείτε να το προσπελάσετε με την μέθοδο | ||
+ | <code java> | ||
+ | public Object getUserObject() | ||
+ | </code> | ||
+ | Σε αυτή την περίπτωση θα χρειαστείτε να γνωρίζετε την κλάση του αντικειμένου το οποίο επιστρέφει η παραπάνω μέθοδος και να εφαρμόσετε κατάλληλο typecasting. | ||
+ | |||
+ | ==== Ανταποκρινόμενοι στα events ενός δένδρου ==== | ||
+ | |||
+ | Ένα δένδρο μπορεί να παράγει δύο τύπους //events//: | ||
+ | * **[[http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TreeSelectionEvent.html|TreeSelectionEvent]]:** events που συνδέονται με επιλογή κόμβων του δένδρου. Τα events αυτά λαμβάνονται μέσα από ένα αντικείμενο που υλοποιεί το interface [[http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TreeSelectionListener.html|TreeSelectionListener]]. | ||
+ | * **[[http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TreeModelEvent.html|TreeModelEvent]]:** events που συνδέονται με μεταβολή της δομής του δένδρου. Τα events αυτά λαμβάνονται μέσα από ένα αντικείμενο που υλοποιεί το interface [[http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TreeModelListener.html|TreeModelListener]]. | ||
+ | |||
+ | === TreeSelectionEvents === | ||
+ | |||
+ | Σε όλα τα events που συνδέονται με ένα αντικείμενο μπορείτε να πάρετε το αντικείμενο το οποίο συνδέεται με το event μέσα από την μέθοδο ''public Object getSource()'' της κλάσης [[http://docs.oracle.com/javase/7/docs/api/java/util/EventObject.html|EventObject]]. Εκτός της παραπάνω μεθόδου, οι μέθοδοι που υποστηρίζει κάθε event αυτού του τύπου είναι τα εξής: | ||
+ | |||
+ | <code java> | ||
+ | Object cloneWithSource(Object newSource) | ||
+ | //Returns a copy of the receiver, but with the source being newSource. | ||
+ | |||
+ | TreePath getNewLeadSelectionPath() | ||
+ | //Returns the current lead path. | ||
+ | |||
+ | TreePath getOldLeadSelectionPath() | ||
+ | //Returns the path that was previously the lead path. | ||
+ | |||
+ | TreePath getPath() | ||
+ | //Returns the first path element. | ||
+ | |||
+ | TreePath[] getPaths() | ||
+ | //Returns the paths that have been added or removed from the selection. | ||
+ | |||
+ | boolean isAddedPath() | ||
+ | //Returns whether the path identified by getPath was added to the selection. | ||
+ | |||
+ | boolean isAddedPath(int index) | ||
+ | //Returns whether the path at getPaths()[index] was added to the selection. | ||
+ | |||
+ | boolean isAddedPath(TreePath path) | ||
+ | //Returns whether the specified path was added to the selection. | ||
+ | </code> | ||
+ | |||
+ | Στο δένδρο του τρέχοντος παραδείγματος μας που υποστηρίζει το μοντέλο επιλογής κόμβων ''SINGLE_TREE_SELECTION'' η μόνη μέθοδος που σας χρειάζεται είναι η getPath() από την οποία λαμβάνεται το [[http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/TreePath.html|TreePath]] του κόμβου που επιλέξατε. | ||
+ | |||
+ | Αντίστοιχα, το interface [[http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TreeSelectionListener.html|TreeSelectionListener]] υποστηρίζει μόνο μία μέθοδο η οποία καλείται κάθε φορά που επιλέγεται νέος κόμβος, όπως φαίνεται παρακάτω. | ||
+ | <code java> | ||
+ | void valueChanged(TreeSelectionEvent e) | ||
+ | Called whenever the value of the selection changes. | ||
+ | </code> | ||
+ | |||
+ | === TreeModelEvents === | ||
+ | |||
+ | Τα events [[http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TreeModelEvent.html|αυτού του τύπου]] δημιουργούνται όταν έχουμε μεταβολή στην δομή του δένδρου. Σε αυτή την περίπτωση θα χρειαστείτε μία κλάση που υλοποιεί το interface [[http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TreeModelListener.html|TreeModelListener]] για να λάβετε τις μεταβολές στη δομή του δένδρου. Ο συγκεκριμένος Listener ορίζει τις παρακάτω μεθόδους. | ||
+ | |||
+ | <code java> | ||
+ | void treeNodesChanged(TreeModelEvent e) | ||
+ | //Invoked after a node (or a set of siblings) has changed in some way. | ||
+ | |||
+ | void treeNodesInserted(TreeModelEvent e) | ||
+ | //Invoked after nodes have been inserted into the tree. | ||
+ | |||
+ | void treeNodesRemoved(TreeModelEvent e) | ||
+ | //Invoked after nodes have been removed from the tree. | ||
+ | |||
+ | void treeStructureChanged(TreeModelEvent e) | ||
+ | //Invoked after the tree has drastically changed structure from a given node down. | ||
</code> | </code> | ||