Java Swing Tables o Construire une table o

Java Swing Tables o Construire une table o Modèle de table o Filtrer un modèle Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 1

Tables n JTable affiche des données dans un tableau n Table. Model régit la gestion des données Java Swing n On peut fournir les données dans un tableau bidimensionnel d’objets : Object[][]et utiliser le Default. Table. Model, mais il vaut mieux étendre Abstract. Table. Model. n La sélection est régi par une modèle de sélection n De plus, il y a un modèle de colonnes. n Un tableau est entouré d’ascenseurs, en général. Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 2

Construire une table n Java Swing Les constructeurs sont JTable() modèles par défaut pour les trois modèles JTable(int num. Rows, int num. Columns) avec autant de cellules vides JTable(Object[][] row. Data, Object[] column. Names) avec les valeurs des cellules de row. Data et noms de colonnes column. Names. JTable(Table. Model dm) avec le modèle de données dm, les autres par défaut. JTable(Table. Model dm, Table. Column. Model cm) avec modèle de données et modèle de colonnes fournis. JTable(Table. Model dm, Table. Column. Model cm, List. Selection. Model sm) Les trois modèles sont fournis. JTable(Vector row. Data, Vector column. Names) ici, les données sont fournies par colonne. Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 3

Exemple Java Swing class Table. Planetes extends JPanel { Table. Planetes() { set. Layout(new Border. Layout()); JTable table = new JTable(cellules, column. Names); add(new JScroll. Pane(table), Border. Layout. CENTER); } private Object[][] cellules = { { "Mercure", new Double(2440), new Integer(0), "non"}, { "Vénus", new Double(6052), new Integer(0), "non"}, { "Terre", new Double(6378), new Integer(1), "non"}, { "Mars", new Double(3397), new Integer(2), "non"}, { "Jupiter", new Double(71492), new Integer(16), "oui"}, { "Saturne", new Double(60268), new Integer(18), "oui"}, { "Uranus", new Double(25559), new Integer(17), "oui"}, { "Neptune", new Double(24766), new Integer(8), "oui"}, { "Pluton", new Double(1137), new Integer(1), "non"} }; private String[] column. Names = { "Planète", "Rayon", "Lunes", "Gazeuse"}; } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 4

Modèles de table Java Swing n Les données sont accessible par un modèle. Ils peuvent être stockés ou calculés, de façon transparente. n La classe Abstract. Table. Model implémente les méthodes d’un modèle de table, sauf public int get. Row. Count() public int get. Column. Count() public Object get. Value. At(int ligne, int colonne) n qui retournent respectivement l le nombre de lignes le nombre de colonnes l’objet à afficher dans les ligne et colonne indiquées (sa méthode to. String est utilisée). Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 5

Un premier exemple n Java Swing En plus des trois méthodes obligées, la fonction get. Colum. Class a été redéfinie, ce qui produit la justification à droite class Simple. Table extends JPanel { Simple. Table() { set. Layout(new Border. Layout()); Table. Model data. Model = new Abstract. Table. Model() { public int get. Column. Count() { return 10; } public int get. Row. Count() { return 10; } public Object get. Value. At(int row, int col) { return new Integer((1+row)*(1+col)); } public Class get. Column. Class(int column) { return Number. class; } }; JTable table = new JTable(data. Model); add(new JScroll. Pane(table)); } } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 6

Un deuxième exemple n Java Swing Construction par Table. Model model = new Model. Investment(30, 5, 10); JTable table = new JTable(model); n avec bien entendu class Model. Investment extends Abstract. Table. Model {. . . } n méthodes à écrire (plus get. Column. Name qui, par défaut, numérote A, B, etc): public int get. Row. Count() public int get. Column. Count() public Object get. Value. At(int ligne, int colonne) public String get. Column. Name(int colonne) Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 7

Détails Java Swing class Model. Investment extends Abstract. Table. Model { private int annees; private int taux. Min; private int taux. Max; private static double depot = 100000. 0; Model. Investment(int annees, int taux. Min, int taux. Max) { this. annees = annees; this. taux. Min = taux. Min; this. taux. Max = taux. Max; } public int get. Row. Count() { return annees; } public int get. Column. Count() { return taux. Max - taux. Min + 1; } public Object get. Value. At(int ligne, int colonne) { double taux = (colonne + taux. Min) / 100. 0; double depot. Final = depot * Math. pow(1 + taux, ligne); return Number. Format. get. Currency. Instance(). format(depot. Final); } public String get. Column. Name(int colonne) { double taux = (colonne + taux. Min) / 100. 0; return Number. Format. get. Percent. Instance(). format(taux); } } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 8

Format de nombres Java Swing n La classe abstraite java. text. Number. Format est la classe de base pour le formatage de nombres. n Nombreuses méthodes statiques retournant des formats appropriés. n Le formatage effectif se fait par la méthode du format String format(int donnée) n Exemples de méthodes: Number. Format. get. Number. Instance() Number. Format. get. Currency. Instance() Number. Format. get. Percent. Instance() n le format dépend de la Locale, c’est-à-dire du pays concerné. Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 9

Autres usages n Java Swing La méthode boolean Table. Model. is. Cell. Editable(int l, int c) renvoie true si la cellule peut être modifiée (par défaut non) n La méthode int JTable. column. At. Point(Point p) renvoie l’indice de la colonne du tableau où est le point n La méthode int JTable. convert. Column. Index. To. Model(int colonne) renvoie l’indice, dans le modèle, de l’indice colonne Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 10

Exemple : tri par ligne Java Swing n On veut trier les lignes, en fonction d’une colonne désignée par un double clic. n On veut que le tri se fasse sur la vue, pas sur le modèle, pour que le modèle soit inchangé. n Pour cela, on introduit un filtre de modèle, similaire aux filtres de streams. n Ce filtre enregistre une référence au modèle réel, et intercepte les communications entre la table et son modèle pour les réinterpréter. n Le filtre maintient une permutation des lignes déterminée par le tri virtuel des lignes en fonction de la colonne choisie. Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 11

Usage n Java Swing Le modèle est associé à la table class Table. Planetes extends JPanel { Table. Planetes() { set. Layout(new Border. Layout()); Default. Table. Model model = new Default. Table. Model(cellules, column. Names); Filtre. Tri. Model sorter = new Filtre. Tri. Model(model); JTable table = new JTable(sorter); sorter. add. Ecouteur(table); add(new JScroll. Pane(table), Border. Layout. CENTER); } private Object[][] cellules = {. . . }; private String[] column. Names = {. . . }; } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 12

Java Swing Tri n La classe Filtre. Tri. Model est un modèle de table avec l l l n n une référence au modèle réel un tableau de lignes une méthode de tri de ce tableau Le tri est fait par la méthode statique de la classe Arrays, en fonction de la colonne choisie. Pour cela, la classe Ligne doit implémenter l’interface Comparable. class Filtre. Tri. Model extends Abstract. Table. Model { public Filtre. Tri. Model(Table. Model m) { model = m; lignes = new Ligne[model. get. Row. Count()]; for (int i = 0; i < lignes. length; i++) { lignes[i] = new Ligne(); lignes[i]. index = i; } } public void sort(int c) { colonne. Tri = c; Arrays. sort(lignes); fire. Table. Data. Changed(); }. . . private Table. Model model; private int colonne. Tri; private Ligne[] lignes; } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 13

Tri (suite) Java Swing n La classe Ligne est interne à Filtre. Tri. Model pour accéder facilement aux données. n Une ligne est plus petite qu’une autre si son élément dans la colonne de tri est plus petit que l’élément de cette même colonne dans l’autre ligne. class Filtre. Tri. Model extends Abstract. Table. Model {. . . private class Ligne implements Comparable { public int index; public int compare. To(Object autre) { Ligne autre. Ligne = (Ligne)autre; Object cellule = model. get. Value. At(index, colonne. Tri); Object autre. Cellule = model. get. Value. At(other. Ligne. index, colonne. Tri); return ((Comparable)cellule). compare. To(autre. Cellule ); } } } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 14

Filtre n Java Swing Les trois fonctions obligées tiennent compte de l’ordre virtuel class Filtre. Tri. Model extends Abstract. Table. Model {. . . public Object get. Value. At(int r, int c) { return model. get. Value. At(lignes[r]. index, c); } public int get. Row. Count(){ return model. get. Row. Count(); } public int get. Column. Count(){ return model. get. Column. Count(); } public String get. Column. Name(int c){ return model. get. Column. Name(c); } public Class get. Column. Class(int c){ return (c == 1 || c == 2) ? Number. class : Object. class; } } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 15

Et le double clic n C’est l’en-tête de colonne qui réagit. n Au double clic sur une colonne, on récupère le numéro de la colonne dans le modèle Java Swing class Filtre. Tri. Model extends Abstract. Table. Model {. . . public void add. Ecouteur(final JTable table) { table. get. Table. Header(). add. Mouse. Listener(new Mouse. Adapter() { public void mouse. Clicked(Mouse. Event event) { if (event. get. Click. Count() < 2) return; int table. Column = table. column. At. Point(event. get. Point()); int model. Column = table. convert. Column. Index. To. Model(table. Column); sort(model. Column); } } Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 16

Evénements n La classe JTable écoute les événements reçus du modèle n Le modèle a plusieurs méthodes pour signaler des modifications de données Java Swing fire. Table. Data. Changed() fire. Table. Structure. Changed() fire. Table. Rows. Inverted(int first, int last) fire. Table. Rows. Updated(int first, int last) fire. Table. Rows. Deleted(int first, int last) fire. Table. Cell. Updated(int row, int col) fire. Table. Changed. Event(Table. Model. Event e) n Les colonnes sont régies par un Table. Column. Model qui a ses propres notificateurs d’événements Jean Berstel - Institut Gaspard Monge, Université Marne-la-Vallée 17
- Slides: 17