Un obiect de tip JList prezintă utilizatorului un grup de item-uri, afișate în una sau mai multe coloane, pentru a oferi acestuia posibilitatea de a alege.
Există trei metode prin care se poate crea un model de listă:
Iată un exemplu de cod care creează și setează parametrii unei liste:
list = new JList(data); // data e de tipul Object[] list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); list.setLayoutOrientation(JList.HORIZONTAL_WRAP); list.setVisibleRowCount(-1); // ... JScrollPane listScroller = new JScrollPane(list); listScroller.setPreferredSize(new Dimension(250, 80));
Alți constructori pentru JList permit inițializarea listei dintr-un obiect de tip Vector sau dintr-un obiect de tipul ListModel. Dacă inițializarea se face dintr-un obiect de tip Vector sau dintr-un vector clasic intrinsec, constructorul implicit creează un model standard de listă.
Apelul setSelectionMode() specifică câte intrări din listă poate selecta utilizatorul și dacă acestea trebuie să fie sau nu continue.
Apelul setLayoutOrientation() permite afișarea datelor în mai multe coloane. Valoarea JList.HORIZONTAL_WRAP specifică faptul că lista ar trebui să își afișeze intrările de la stânga la dreapta înainte de a trece la o nouă linie. O altă valoare posibilă este JList.VERTICAL_WRAP, care specifică afișarea datelor de sus până jos (ca de obicei) înainte de a trece la o coloană nouă.
O listă utilizează o instanță de ListSelectionModel pentru a-și gestiona selecția. Implicit, modelul de selecție a unei liste permite selecția oricărei combinații de intrări la un moment dat. Se poate specifica un mod diferit de selecție prin apelul metodei setSelectionMode():
public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { if (list.getSelectedIndex() == -1) { fireButton.setEnabled(false); } else { fireButton.setEnabled(true); } } }
Multe evenimente de selecție pot fi generate de o singură acțiune a utilizatorului, cum ar fi un click. Metoda getValuesAdjusting() returnează true dacă utilizatorul încă manipulează selecția. Programul de mai sus este interesat doar de rezultatul final al acțiunii utilizatorului și, de aceea, metoda valueChanged() conține secvența de cod doar dacă getValuesAdjusting() întoarce false.
Deoarece lista este în modul SINGLE_SELECTION, acest cod poate utiliza metoda getSelectedIndex() pentru a obține indexul intrării tocmai selectate. JList pune la dispoziție și alte metode pentru a seta sau a obține selecția când se pot alege mai multe intrări. De asemenea, se pot asculta evenimente direct pe modelul de selecție, dacă acest lucru este dorit.
listModel = new DefaultListModel(); listModel.addElement("Debbie Scott"); listModel.addElement("Scott Hommel"); listModel.addElement("Alan Sommerer"); list = new JList(listModel);
Programul de mai sus utilizează o instanță DefaultListModel. În ciuda numelui, lista nu deține un DefaultListModel decât dacă acest lucru este setat explicit din program.
Altă metodă de adăugare, cu specificare exactă a poziției de inserare, este cea care uzitează metoda insertElementAt. Ștergerea este, de asemenea, foarte simplă, deoarece există metoda remove.
listModel.insertElementAt(employeeName.getText(), index); listModel.remove(index);
O listă folosește un obiect numit Cell Renderer pentru a-și afișa intrările. Cel implicit știe să afișeze șiruri de caractere și imagini și afișează tipul Object invocând metoda toString().
Dacă se dorește schimbarea modului în care se face afișarea sau dacă se dorește un comportament diferit față de cel oferit de toString(), se poate implementa un Cell Renderer customizat.
Pașii ce trebuie urmați sunt:
Clasa JTable este folosită pentru a afișa și edita tabele de celule în două dimensiuni.
JTable deține numeroase facilități care permit customizarea după preferințe dar în același timp oferă și opțiuni standard pentru aceste facilități astfel încât tabele simple pot fi create foarte rapid și ușor.
De exemplu, un tabel cu 10 linii și 10 coloane se poate obține astfel:
TableModel dataModel = new AbstractTableModel() { public int getColumnCount() { return 10; } public int getRowCount() { return 10; } public Object getValueAt(int row, int col) { return new Integer(row * col); } }; JTable table = new JTable(dataModel); JScrollPane scrollpane = new JScrollPane(table);
DefaultTableModel este o implementare de model care folosește un vector de vectori de obiecte (de tipul Object) pentru a stoca valorile din celule.
La fel cum se pot copia datele dintr-o aplicație în instanța DefaultTableMode, este, de asemenea, posibil să se ascundă datele în metodele interfeței TableModel astfel încât acestea să poată fi transmise direct către JTable, la fel ca în exemplul de mai sus.
Această abordare duce deseori la aplicații mai eficiente, deoarece modelul este liber să aleagă reprezentarea internă care se potrivește cel mai bine datelor manipulate.
JTable folosește exclusiv variabile întregi pentru a referi liniile și coloanele modelului pe care îl afișează. Este folosită metoda getValueAt(int, int) pentru a întoarce valorile din model pe parcursul desenării.
Coloanele pot fi rearanjate în tabel astfel încât acestea să apară într-o ordine diferită față de cea din model. Acest fapt nu afectează deloc implementarea: atunci când coloanele sunt rearanjate, obiectul de tip JTable menține intern noua ordine și convertește indicii coloanelor înainte de orice interogare a modelului.
În versiunea curentă de Java sunt adăugate metode la clasa JTable care permit acces convenabil către nevoi obișnuite de afișare. Noile metode print() adaugă cu ușurință suport de printare aplicației ce se dorește a fi dezvoltată.
În plus, noua metodă getPrintable(javax.swing.JTable.PrintMode, java.text.MessageFormat, java.text.MessageFormat) este disponibilă pentru necesități avansate.
La fel ca pentru toate clasele JComponent, se pot folosi InputMap și ActionMap pentru a asocia o acțiune cu tasta și a executa acțiunea în condiții specificate.
Clasa JTree permite afișarea datelor ierarhice (sub forma unei schițe).
Un nod specific poate fi identificat fie printr-un TreePath (un obiect care încapsulează nodul și toți strămoșii acestuia), fie prin linia de afișare, unde fiecare linie din zona de afișare conține un singur nod.
Următorul grup de metode folosesc cuvântul “visible” pentru a se referi la “poate fi vizualizat” (sub un părinte expandat):
Pentru a detecta schimbarea selecției, se va implementa interfața TreeSelectionListener și se va adăuga o instanță folosind addTreeSelectionListener(). Metoda valueChanged() va fi invocată atunci când utilizatorul selectează alt nod, și doar o dată, chiar dacă se efectuează un click de două ori pe același nod.
Cu toate acestea, pentru a face separarea cazurilor de dublu click, indiferent de selecția anterioară, este recomandată abordarea prezentată în codul prezentat mai jos.
// final JTree tree = ...; MouseListener ml = new MouseAdapter() { public void mousePressed(MouseEvent e) { int selRow; selRow = tree.getRowForLocation(e.getX(), e.getY()); TreePath selPath; selPath = tree.getPathForLocation(e.getX(), e.getY()); if (selRow != -1) { if (e.getClickCount() == 1) { mySingleClick(selRow, selPath); } else if (e.getClickCount() == 2) { myDoubleClick(selRow, selPath); } } } }; tree.addMouseListener(ml);
Pentru afișarea nodurilor complexe (de exemplu, noduri conținând atât text, cât și o icoană) se va implementa interfața TreeCellRenderer și se va folosi metoda setCellRenderer(javax.swing.tree.TreeCellRenderer).
Pentru a edita astfel de noduri, se va implementa interfața TreeCellEditor și se va folosi metoda setCellEditor(TreeCellEditor).