Création d'une table

     

alt : l'applet n'est pas visible par votre navigateur (dans le menu Outils, Modules complémentaires, activer le plugin Java(TM) Platform SE 6 U32 6.0.320.5 s'il est désactivé)

Dans l'applet, vous pouvez mettre un nom dans la première colonne et des entiers dans les colonnes des notes ; vous devez voir apparaître la moyenne des notes dans la dernière colonne.

La classe javax.swing.JTable permet de construire des tableurs. Cette classe offre beaucoup de possibilités dont notre exemple vous donne un aperçu.

L'exemple a pour objectif, comme on le voit sur l'applet, de consigner des notes d'élève dans une table et d'en calculer automatiquement la moyenne. Une note absente ou non conforme au format d'un entier n'est pas prise en considération dans la moyenne.

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
import javax.swing.event.TableModelListener;
import javax.swing.event.TableModelEvent;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.text.DecimalFormat;

public class Tableur extends JFrame implements TableModelListener {
JTable table;
DefaultTableModel tableur;

public Tableur() {
tableur = new DefaultTableModel();
tableur.addColumn("Nom");
tableur.addColumn("Note1");
tableur.addColumn("Note2");
tableur.addColumn("Note3");
tableur.addColumn("Moyenne");
tableur.setRowCount(10);
table = new JTable(tableur);
table.setPreferredScrollableViewportSize(new Dimension(300, 200));
JScrollPane avecAsc = new JScrollPane(table);
add(new JScrollPane(table), BorderLayout.CENTER);
tableur.addTableModelListener(this);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(200, 300);
pack(); setVisible(true);
}

public void tableChanged(TableModelEvent e) {
if (e.getType() != TableModelEvent.UPDATE) return;
int colonne = e.getColumn();
int nbColonnes = tableur.getColumnCount();
if ((colonne == 0) || (colonne == nbColonnes - 1)) return;

int ligne = e.getFirstRow();
int i, somme = 0, nb = 0;
String chaine;
DecimalFormat forme = new DecimalFormat();

forme.setMaximumFractionDigits(2);

for (i = 1; i < nbColonnes - 1; i++) {
try {
chaine = (String)tableur.getValueAt(ligne, i);
if (chaine != null) {
somme += Integer.parseInt(chaine);
nb++;
}
}
catch(NumberFormatException exc) {
System.out.println("Les notes doivent etre des entiers");
}
}
if (nb > 0)
tableur.setValueAt(forme.format((double)somme/nb), ligne, nbColonnes - 1);
else tableur.setValueAt("", ligne, nbColonnes - 1);

}
}

class EssaiTableur {
public static void main(String[] arg) {
new Tableur();
}
}

Vous pouvez disposer de :

  • code de l'application.
  • code de l'applet.
    tableur = new DefaultTableModel(); : la javax.swing.table.DefaultTableModel modélise l'ensemble des données contenues par la table.
    tableur.addColumn("Nom"); : Cela ajoute une colonne à la table des données.
    tableur.addTableModelListener(this); : l'interface javax.swing.event.TableModelListener déclare uniquement la méthode public void tableChanged(TableModelEvent e).
    table = new JTable(tableur); : on met dans l'objet graphique de type JTable la table des données.
    table.setPreferredScrollableViewportSize(new Dimension(300, 50)); : d'une manière plus générale, le "viewport" est lié à un composant avec ascenseurs et représente la partie visible du sous-composant contenu. On fixe donc ici la taille de la partie visible de la table, qui sera au départ toute la table.
    new JScrollPane(table) : si on ne met pas d'ascenseur, les noms des colonnes n'apparaissent pas.
    if (e.getType() != TableModelEvent.UPDATE) : le type d'événement peut être UPDATE si on a changé les données de la table, INSERT si on a ajouté une ligne ou une colonne, DELETE si on a supprimé une ligne ou une colonne.
    e.getFirstRow(); : on obtient le premier numéro de colonne sur laquelle l'événement s'est produit.

    ©Irène Charon, Télécom ParisTech 2011