Clasa JFileChooser are un număr mare de constructori si metode. La crearea instanțelor acestei clase se poate indica sub diverse forme directorul care va servi drept rădăcină a arborelui. În lipsă, se consideră ca rădăcina este directorul principal (home) al utilizatorului aplicației. Metodele permit, printre altele, să se deschidă o fereastră de dialog pentru selectarea fișierelor (în mod Open sau Save) și să se determine calea și numele fișierului selectat.
Când este selectat un fișier, instanța respectivă a clasei
JFileChooser generează un eveniment de acțiune (ActionEvent).
Dintre constructorii clasei JFileChooser menționăm
aici: public JFileChooser() - creează un JFileChooser care pornește de la directorul principal al utilizatorului (user home directory); public JFileChooser(String currentDirectoryPath) - creează un JFileChooser care are ca rădăcină directorul a cărui cale este dată ca argument; public JFileChooser(File currentDirectory) - creează un JFileChooser care are ca rădăcină directorul a cărui cale este dată ca argument sub forma de instanță a clasei File; Dintre metodele clasei JFileChooser menționăm aici: |
Exemplu: În fișierul TestJFileChooser.java
este dat un exemplu de aplicație, în care se testează funcționarea unui
JFileChooser. Aplicația conține o interfața grafică (clasa GUI) care
prezintă trei butoane:
Open file - deschide o fereastră de dialog pentru deschidere de
fișiere;
Save file - deschide o fereastra de dialog pentru salvare de
fișiere;
Clear - șterge aria de text de afișare a mesajelor.
Dacă se apasă pe unul din butoanele "Open file" sau "Save file" se
deschide fereastra de dialog corespunzătoare, iar după ce se face
selecția și se apasă unul din butoanele Open/Save sau Cancel se închide
fereastra și se afișează în aria de text din interfața grafică mesajul
privind selecția făcută.
Forma sub care arborele este afișat pe ecran este asemănătoare cu cea sub care apare arborele sistemului de fișiere într-un JFileChooser. Deosebirea este că, acum, nodurile arborelui nu mai conțin directoare sau fișiere, ci orice alte informații, depinzând de aplicație. Principalul avantaj al clasei JTree este că dă posibilitatea să se lucreze cu arborele în mod interactiv, selectând diferite noduri ale acestuia prin intermediul interfeței grafice.
Ca exemplu, în fișierul TestJTree1.java
este dată o aplicație simplă cu interfață grafică, în care apare o
instanță a clasei JTree, creată prin instrucțiunea
JTree tree=new JTree();
Acest constructor creează un JTree care conține deja în mod implicit un
exemplu de arbore. Aplicația vizualizează acest arbore pe ecran și
afișează la partea de jos calea catre ultimul nod selectat. Se poate
urmări modul în care se expandează și se colapsează nodurile arborelui
și se afisează efectul selectării unui nod.
Dintre constructorii clasei JTree menționăm aici: public JTree() - creează un JTree care conține un exemplu de arbore; public JTree(TreeNode root) - creează un JTree care are ca radacină nodul root, primit ca argument; public JTree(TreeModel newModel) - creează un JTree care conține un arbore care respectă modelul newModel. Dintre metodele clasei JTree menționăm aici: public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) - convertește valoarea din nod (obiectul de informație atașat nodului respectiv) într-un text afișabil pe ecran. Această metodă este apelată de programul de vizualizare a arborelui. Pentru a se vizualiza nodul sub altă formă decât cea dată de metoda toString() a obiectului value din nodul respectiv, este necesar să definim propria noastră clasă de arbore, care extinde clasa JTree și în care să fie redefinită metoda convertValueToText. |
Precizăm că instanțele clasei JTree nu conțin arborele propriu-zis, ci numai reprezentarea grafică a arborelui. Aceasta reprezentare se creează la executarea unui constructor al clasei JTree. De exemplu, dacă se execută expresia new JTree(radacina), în care rădăcina este referința la un TreeNode, atunci se construiește reprezentarea grafică a arborelui care are ca rădăcină nodul radacina. Dacă acest arbore iși modifică ulterior structura, este necesar să se construiască o altă instanță a clasei JTree, care reflectă noua structură.
Conform acestei specificații, orice clasă care are ca
instanțe noduri ale unui JTree trebuie să conțina următoarele metode:
public int getChildCount() - întoarce numărul de
fii; |
Interfața javax.swing.tree.MutableTreeNode extinde interfața
TreeNode pentru cazul în care nodul permite să fie modificat. În
consecință, ea oferă și metodele necesare pentru modificarea nodului.
În plus față de interfața TreeNode, interfața MutableTreeNode
impune următoarele metode: public void insert(MutableTreeNode child, int index) - înserează noul fiu child pe poziția index; public void remove(int index) - elimină fiul de pe poziția index; public void remove(MutableTreeNode node) - elimină fiul node; public void setUserObject(Object object) - înlocuiește obiectul de informație din nod prin object; public void removeFromParent() - elimină nodul din lista fiilor părintelui acestuia; public void setParent(MutableTreeNode newParent) - pune nodul ca fiu al lui newParent. |
Clasa are următorii constructori: public DefaultMutableTreeNode() - creează un nod fără conținut, dar modificabil; public DefaultMutableTreeNode(Object userObject) - creează un nod care conține obiectul userObject, nu are fii și este modificabil; public DefaultMutableTreeNode(Object userObject, boolean allowsChildren) - creează un nod care conține obiectul userObject, nu are fii, iar proprietatea de a fi modificabil este dată de al doilea argument; Clasa DefaultMutableTreeNode implementează toate metodele
interfețelor TreeNode și MutableTreeNode. Dintre metodele pe care le
conține în plus față de interfețele menționate, remarcăm
aici: |
Exemplu: În fișierul TestJTree2.java este dat un exemplu de aplicație, în care se testează crearea și actualizarea unui arbore, ale cărui informații din noduri conțin șiruri de caractere. Nodurile arborelui sunt instanțe ale clasei DefaultMutableTreeNode. Reprezentarea grafică a arborelui se face printr-o instanță a clasei JTree, la construirea căreia se dă ca argument nodul rădăcină al arborelui. Interfața grafică conține la partea superioară un șir de butoane pentru adăugarea sau eliminarea unui nod și pentru traversarea arborelui în preordine, în postordine și in lățime. Partea centrală a interfeței grafice conține un panou împărțit în două (JSplitPane), care are în partea stangă reprezentarea grafică a arborelui, iar în partea dreaptă o arie de text pentru afișarea rezultatelor traversării. La partea de jos este o etichetă pentru mesaje. Inițial, arborele conține numai nodul rădăcină. Dacă se selectează un nod și se apasă pe butonul "Pune fiu", apare o fereastră de dialog, în care se cere să se introducă numele fiului. După introducerea acestuia, se pune nodului selectat anterior un nou fiu cu numele dat de utilizator. Dacă se selectează un nod și se apasă pe butonul "Elimina nod", se elimină nodul selectat. Dacă se apasă pe unul din butoanele "In preordine", "In postordine" sau "In lățime", se afișează în aria de text rezultatul traversării de tipul corespunzător. În fine, dacă se apasă butonul "Stergere text", se șterge conținutul ariei de text.
La fiecare adăugare sau eliminare de nod, se creează o noua instanță
a clasei JTree și se pune în locul celei anterioare.
Considerăm că programul clasei TestJTree2
este ușor de urmărit, atât datorită modularizării specifice programării
orientate pe obiecte, cât și datorită comentariilor pe care le conține.
Vom face, deci, aici numai câteva precizări suplimentare.
Pentru crearea arborelui s-au folosit instrucțiunile Era posibil, de asemenea, să se creeze arborele prin
instrucțiunile următoare: Pentru ascultarea evenimentelor de selecție s-a creat clasa AscultSelectie. Metoda valueChanged a acestei clase determină și memorează în variabila path calea către ultimul nod selectat. Modificarea arborilor se face prin metodele claselor ascultătoare PuneFiu și EliminaNod, care ascultă evenimentele de acțiune generate de butoanele cu aceleași nume. În metoda actionPerformed a clasei PuneFiu se cere utilizatorului, printr-o fereastră de dialog, să se introducă numele fiului adăugat, după care se determină nodul selectat ca fiind ultimul din calea selectată și i se pune un fiu cu conținutul dat de utilizator, după care se reconstruiește instanța clasei JTree pentru noul arbore și se pune în interfața grafică în locul celei vechi. În metoda actionPerformed a clasei EliminaNod se determină nodul de eliminat, ca fiind ultimul nod din calea selectată, și i se aplică acestui nod metoda removeFromParent(), făcându-se astfel efectiv eliminarea lui din arbore. Dacă acest nod este rădăcina unui subarbore, se elimină întregul subarbore. După eliminare, se reconstruiește instanta clasei JTree și se pune în locul celei vechi. Pentru traversarea arborelui în preordine, în postordine și în lățime s-a creat clasa ascultatoare Traversari, care invocă metodele de traversare corespunzătoare ale clasei DefaultMutableTreeNode. Aceste metode întorc o enumerație (un iterator) care respectă interfața java.util.Enumeration. Această enumerație este apoi folosită pentru afișarea în aria de text a succesiunii nodurilor în traversarea respectivă. În acest exemplu s-au folosit numai o mică parte din facilitățile oferite de clasele JTree, DefaultMutableTreeModel și clasele conexe. Pentru aprofundare, recomandăm consultarea capitolului How to Use Trees din secțiunea Creating a GUI with JFC/Swing, subsecțiunea Using Swing Components a tutorialului Java (The Java Tutorial, al firmei Sun) . |