IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Regex et JTable


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 63
    Par défaut Rege
    Sqs

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Par défaut
    Bonjour,

    Ce que tu veux, c'est récupérer pour chaque TR le contenu des TD associés dans le but de les injecter dans un JTable ou comment faire pour ajouter des lignes / colonnes dans un JTable?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Par défaut
    Pour la première partie, tu dois normalement récupéré une page html, via un GET / POST (en utilisant le package java.net / lecture d'un fichier sur le disque). Apparement, cette partie la est faite.

    Tu as deux possibilités ensuite :

    • Utiliser une solution de recherche à base de pattern / regexp (bien si tu fait peu de parsing html dans ton application)
    • Utiliser un framework permettant de parser du code HTML (comme JERICHO, très simple d'utilisation http://sourceforge.net/projects/jerichohtml/). Il te fournira des méthodes d'accès pour manipuler du code HTML (récupérer un objet TABLE, l'ensemble des élements TR de ce table, l'ensemble des éléments TD de chaque élément TR, leur contenus texte, etc.)

    Quelque soit la solution, ça ne sert strictement à rien de sauvegarder le contenu du table pour ensuite manipuler / injecter les données dans le JTable. En supposant que tu utilises Jericho , il te suffit juste :


    • Recuperer l'objet table te concernant dans la page via JERICHO et créer un tableau a deux dimensions (String[][] trValues) qui va contenir pour chaque ligne TR , un tableau representant les valeurs des TD contenus.
    • Récupérer la liste des TR via JERICHO (méthode findAllElements sur l'objet table)
    • Pour chaque TR, récupérer la liste des TD via JERICHO (méthode findAllElements sur l'objet TR courant) et créer un tableau du genre String tdValues[NB_TD] qui va contenir les valeurs des tds de la ligne courante
    • Pour chaque TD, ajouter la valeur dans le tableau tdValues

    Utiliser le constructeur JTable(Object[][] rowData, Object[] columnNames) pour créer ton JTable.


    Voila de tête une idée d'implémentation.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Par défaut
    Héhéhé je comprends mieux

    Et ton tp impose l'utilisation d'expressions régulières ? Ou tu peux utiliser autre chose?

    Est ce que c'est un tableau assez simple pour l'exemple, ou dois tu gérer les colspan, le fait que le tableau puisse être mal formé, les entêtes (TH) etc.. ?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Par défaut
    Je veux bien t'aider yep, tu veux un coup de main sur les expressions régulières en gros?

    Si c'est ça, te faudrait deux expressions régulières :

    • pour récupérer une liste de TR avec leurs attributs
    • pour récupérer une liste de TD avec leurs attributs

    Ton prof t'a filé une grammaire simplifiée pour l'exercice ou on doit considérer l'ensemble des options utiles d'un TR / TD / TH ?

  6. #6
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    salut,

    tu pourrais faire ceci

    d'abord tu crée 2 vecteurs, le premier qui contiendra les données du tableau, le deuxième contiendra les noms de colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Vector data = new Vector();
    Vector columnNames = new Vector();
    columnNames.add("Num");columnNames.add("Nom Prénom");
    columnNames.add("Adresse");columnNames.add("Identifiant");
    columnNames.add("Année");
    après, puisque tu as déjà le contenu de ta balise table, tu récupères ligne de ta table, et tu ajoutes chaque ligne à ton vecteur data
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    static void extraireLignes(String table)
    {
    	Pattern p = Pattern.compile(".*?<tr[^>]*>(.*?)</tr>.*?");
    	Matcher m = p.matcher(table);
    	while (m.find())
    	{
    		ajouterLigne(m.group(1));
    	}
    }
    static void ajouterLigne(String ligne)
    {
    	Vector lineData = new Vector();//vecteur qui contiendra les cellules de la ligne
    	Pattern p = Pattern.compile(".*?<td[^>]*>(.*?)</td>.*?");
    	Matcher m = p.matcher(ligne);
    	while (m.find())
    	{
    		lineData.add(m.group(1));
    	}
    	data.add(lineData);
    }
    public void copierDepuisUneUrl(String uneUrl, String uneAdresseLocale) throws IOException {
    	....
    	while(m.find()) {
    		extraireLignes(m.group(1));
    	}
            ......
    }
    et puis tu crée ton JTable en lui passant les 2 vecteurs créés

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Par défaut
    Re, après une petite tartiflette, ca va toujours mieux

    Et bien, si c'est juste la construction du JTable, comme je te le disais, c'est assez simple, un tableau de String pour les entêtes des colonnes, un tableau a deux dimensions qui va contenir les lignes / colonnes

    Voila un petit exemple sur une table toute simple avec 2 colonnes / 2 Lignes (le code html est en dur dans le source)
    C'est juste pour donner une idée, faut le repenser pour que ce soit propre aux niveaux de l'utilisation des groupes de regexp etc
    Il faudra aussi gérer le fait qu'on peut avoir des balises comme <b>, <i>, etc dans le contenu du td (pour ce qui est du colspan, tu peux laisser tomber, vu qu'il faut le même nombre de colonnes dans le contexte de ton exercice)

    Ps : Syntaxe java 1.4, si tu bosses en 1.5 et +, faut penser à typer les Listes etc

    Mais dans l'ensemble, ton code devra ressembler à ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    String htmlContent = "<table><tr><td>1.1</td><td>1.2</td></tr><tr><td>2.1</td><td>2.2</td></tr></table>";
            try {
                String TR_PATTERN = "<tr[^>]*>(.*?)</tr>";
                String TD_PATTERN = "<td[^>]*>(.*?)</td>";
     
                Pattern pTR = Pattern.compile(TR_PATTERN);
                Pattern pTD = Pattern.compile(TD_PATTERN);
                Matcher mTR = pTR.matcher(htmlContent);
                Matcher mTD    = null;
                List trs = new ArrayList();
                while (mTR.find()) {
                    String currentTR = htmlContent.substring(mTR.start(), mTR.end());
                    mTD = pTD.matcher(currentTR);
                    List tds = new ArrayList();
                    while (mTD.find()) {
                        tds.add(mTD.group(1));
                    }
                    trs.add(tds.toArray(new String[0]));
                }
                String[] headers = {"titreCol1","titreCol2"};
                String [][] content = new String[trs.size()][];
                for (int i=0;i<trs.size();i++) {
                    content[i] = (String[])trs.get(i);
                }
                JTable jt = new JTable(content,headers);
            }
            catch (PatternSyntaxException pse){
                pse.printStackTrace();
            }
    Bon courage et si tu as besoin, hésites pas à me contacter par MP / via ce post

    EDIT : Owned à 2 minutes par Herch ^^

  8. #8
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    ben tu l'ajoutes à une JFrame que tu crée

  9. #9
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    tu as déjà posté la question sur comment enlever les balises. tu n'as qu'à appliquer la réponse au résultat que tu obtiens quand tu récupères le contenu des balises td

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Par défaut
    Bonsoir,

    Pour les entêtes de colonnes, c'est soit des éléments TH, soit des élements TR contenus dans tbody (comme dans ton exemple). Il suffit donc de rajouter une petite expression régulière et le tour est joué.

    Espérons que ça te donne une bonne note et que ton prof passe pas sur le forum

    Ps : J'ai répondu à ton MP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Swing]JTable- Dimensionner les colonnes
    Par loutfi dans le forum Composants
    Réponses: 12
    Dernier message: 01/07/2011, 08h50
  2. Cherche regex...
    Par laurent_h dans le forum C
    Réponses: 4
    Dernier message: 31/03/2003, 11h24
  3. [SWING]jTable + Focus
    Par chady dans le forum Composants
    Réponses: 5
    Dernier message: 27/02/2003, 14h51
  4. JBuilder7 & JTable Colonne alignement
    Par Tonton Luc dans le forum JBuilder
    Réponses: 5
    Dernier message: 06/11/2002, 17h32
  5. Réponses: 9
    Dernier message: 12/08/2002, 07h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo