60 likes | 247 Views
JTable. JTable. Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)}, {"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)}, {"Kathy", "Walrath", "Chasing toddlers", new Integer(2), new Boolean(false)},
E N D
JTable Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)}, {"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)}, {"Kathy", "Walrath", "Chasing toddlers", new Integer(2), new Boolean(false)}, {"Mark", "Andrews", "Speed reading", new Integer(20), new Boolean(true)}, {"Angela", "Lih", "Teaching high school", new Integer(4), new Boolean(false)} }; String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; JTable table = new JTable(data, columnNames); • JTable un composant Swing complexe pour présenter et éditer des données sous forme de table.
JTable • Deux constructeurs qui acceptent directement des données : • JTable(Object[][] rowData, Object[] columnNames) • JTable(Vector rowData, Vector columnNames) • Simplicité • Mais • chaque cellule est éditable • traite toutes les données de manière identique (affichage sous forme de String quel que soit le type de la donnée) • Si les données ne sont pas déjà sous la forme d’un tableau (ou d’un Vector) nécessité de les transposer dans une telle structure
Le fameux modèle* MVC (Model View Controler) issu de SmallTalk * design pattern Modèle JTableModel JTable Vue Contrôleur JTable • Si les données ne sont pas déjà sous une forme « tabulaire » et/ou si on ne veut pas avoir les restrictions précédentes il faut fournir un objet TableModel au composant JTable qui permet à l’objet JTable de découvrir la valeur de chaque cellule : • JTable(TableModel data) • public void setModel(TableModel data) • JTable ne contient pas les données mais c’est une vue sur les données« JTable doesn’t contain or cache data; it’s simply a view of your data. »
JTable JTableModel • JTableModel • interface définie dans le package javax.swing.table • intermédiaire entre le composant JTable et les données qu’il affiche • tout composant JTable utilise un objet qui implémente JTableModel pour encapsuler les données qu’il visualise. Modèle Class getColumnClass(int columnIndex) int getColumnCount() String getColumnName(int columnIndex) int getRowCount() Object getValueAt(int rowIndex, int columnIndex) JTable Contrôleur Vue boolean isCellEditable(int rowIndex, int columnIndex) void setValueAt(Object aValue, int rowIndex, int columnIndex) void addTableModelListener(TableModelListener l) void removeTableModelListener(TableModelListener l)
Implémentation partielle de JTableModel, seules demeurent abstraites : • int getColumnCount() • int getRowCount() • Object getValueAt(int rowIndex, int columnIndex) • Pour une application nécessitant un table non éditable il suffit de donner une implémentation • à ces méthodes AbstractTableModel DefaultTableModel Implémentation « simple » de JTableModel lorsque les données sont exprimées sous la forme de tableaux (ou vecteurs) de lignes, chaque ligne étant elle même un tableau (ou un vecteur) d’objets. Les constructeurs JTable(Object[][] rowData, Object[] columnNames) et JTable(Vector rowData, Vector columnNames)initialisent et utilisent un objet DefaultTableModel JTable < interface> JTableModel