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

Composants Java Discussion :

Afficher le résultat d'un programme dans un JTable


Sujet :

Composants Java

  1. #1
    Membre habitué
    Homme Profil pro
    Passioné
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Par défaut Afficher le résultat d'un programme dans un JTable
    Bonjour à tous

    Après de multiples recherches, je sèche sur un point particulier, sûrement simple. j'ai eu beau tenter plusieurs tests, rien n'y fait.
    Je viens vers vous pour éclairer ma lanterne.
    J'ai concocté un petit programme, me permettant de détecter les différents périphériques de stockages branchés, donnant ceci:
    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
    import java.io.File;
     
    public class TailleDisque {
      public static void main(String[] args) {
        File[] racines = File.listRoots();
     
        for (int i = 0; i < racines.length; i++) {
          System.out.print(racines[i]);
          System.out.print(" : Taille du disque = " + racines[i].getTotalSpace() + " octet(s)");
     
          int giga = 1073741824;
          double nbregiga = (double) (racines[i].getTotalSpace()) / (double) (giga);
          System.out.println(" (" + nbregiga + " Go)");
        }
      }
    }
    Jusque là, tout va bien, me donnant un résultat du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C:\ : Taille du disque = 90025488384 octet(s) (83.84276962280273 Go)
    D:\ : Taille du disque = 0 octet(s) (0.0 Go)
    E:\ : Taille du disque = 1000202039296 octet(s) (931.5107383728027 Go)
    Q:\ : Taille du disque = 0 octet(s) (0.0 Go)
    J'aimerai cependant intégrer les résultats dans un JTable, composé de trois colonnes (Sélection (boolean), Périphériques, Capacité)
    Et c'est là que le bas blesse, je n'arrive pas à faire ressortir les résultats dans le tableau dont le code est le suivant:
    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
     jTableDisk.setModel(new javax.swing.table.DefaultTableModel(        		
                new Object [][] {
                            {null, null, null},
                            {null, null, null},
                            {null, null, null},
                            {null, null, null}
                        },
                        new String [] {
                            "Sélection", "Périphérique", "Capacité"
                        }
                    ) {
                        Class[] types = new Class [] {
                            java.lang.Boolean.class, java.lang.String.class, java.lang.String.class
                        };
                        boolean[] canEdit = new boolean [] {
                            true, false, false
                        };
     
                        public Class getColumnClass(int columnIndex) {
                            return types [columnIndex];
                        }
     
                        public boolean isCellEditable(int rowIndex, int columnIndex) {
                            return canEdit [columnIndex];
                        }
                    });
     
                    jTableDisk.setName("");

    Une bonne âme pourrait elle m'orienter sur cette solution, s'il vous plait?
    En vous remerciant d'avance de vous pencher sur mon problème et en vous souhaitant de bonnes fêtes de fin d'année.
    Cordialement,
    Irish

  2. #2
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 594
    Par défaut
    Bonjour je sais pas si sa peut vous-aidez http://www.developpez.net/forums/d14...jtable-jpanel/ bonne journée.

  3. #3
    Membre habitué
    Homme Profil pro
    Passioné
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Par défaut
    Bonjour kevin254kl,

    Merci de t’intéresser à mon sujet. Je viens de parcourir le topic, mais cela concerne l'effacement d'une JTable de un JPanel, et ne traite pas mon problème de faire apparaitre un résultat d'un programme dans mon tableau, sniff.
    Merci tout de même
    Je continue à chercher si mon post n'est pas en doublon, afin de ne pas vous faire perdre de temps, mais je n'en ai pas l'impression

  4. #4
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 594
    Par défaut
    Bonsoir,je ne comprend pas le problème ton jtable ne s'affiche ou n'affiche pas comme vous voulez ? voici un autre lien plus pertinent http://thierry-leriche-dessirier.dev...lemodel-5-min/ bonne soirée

  5. #5
    Membre habitué
    Homme Profil pro
    Passioné
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Par défaut
    (Re) Bonsoir kevin254kl,
    Si, mon tableau s'affiche parfaitement dans ma JFrame, ce que je n'arrive pas à faire, c'est d'intégrer mon programme de détection de périphériques dans mon tableau.
    Comment le résultat du programme s'affichant par un "System.out.print()" peur être envoyé dans le JTable?
    Auriez vous une idée pour cela?
    Merci (encore) de votre intérêt

  6. #6
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 594
    Par défaut
    Bonjour votre variable qui calcul le nombre de giga à chaque tour de boucle les données sont perdu,faite un tableau cordialement.

  7. #7
    Membre habitué
    Homme Profil pro
    Passioné
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Par défaut
    Bonjour kevin254kl,

    C'est justement ce que j'essaie de faire, d'inclure mes données dans le tableau que j'ai formulé.
    Comment "transférer" mes "System.out.print()" dans les cellules?

  8. #8
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 594
    Par défaut
    Bonjour,vous ne pouvez pas, vos ouvre un flux de sortie http://docs.oracle.com/javase/7/docs...ng/System.html voir la doc,
    par contre je pense que vous pouvez récupérer vos tableaux de votre classe pour initialiser votre jtable :

    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
    import java.io.File;
     
    public class TailleDisque {
      public static void main(String[] args) {
        File[] racines = File.listRoots();
    	double[] nbregiga = new double[racines.length]; 
     
        for (int i = 0; i < racines.length; i++) {
          racines[i];
          System.out.print(" : Taille du disque = " + racines[i].getTotalSpace() + " octet(s)");
     
          int giga = 1073741824;
           nbregiga[i] = (double) (racines[i].getTotalSpace()) / (double) (giga);
          System.out.println(" (" + nbregiga + " Go)");
        }
      }
    }
    ici on à toutes les informations qu'il nous faut nbregiga et racine,à vous de récupérer ces tableaux la ou vous voulez instancier votre jtable,je pense qu'il faudra faire une fusion de tableau ce n'ai que mon avis je ne suis pas expert,je n'ai pas testé le programme à vous de l'adapter selon vos besoins ou de le modifier,j'espère que cela vous débloquera bonne journée.

  9. #9
    Membre habitué
    Homme Profil pro
    Passioné
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Par défaut
    Merci kevin254kl pour ce conseil si matinal...! je vais me tourner sur ce genre de structure et vous tiens informé du résultat
    Bonne journée également, et @ l'année prochaine...!!

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Par défaut
    Bonjour,

    En lisant votre code rapidement, j'ai l'impression que vous ne faites pas les choses dans le bon ordre. Les étapes dans l'ordre :
    - Récupérer la liste des périphériques et les stocker dans une variable
    - Récupérer le nombre de lignes du tableau. Disons "n".
    - Créer un tableau bien dimensionné (String[][] tableau = new String[n][3]; //n lignes, 3 colonnes à priori dans votre cas)
    - Remplir ce tableau grâce à une boucle "for" et à la liste des périphériques stockée à la première étape
    - afficher ce tableau en le passant en paramètre de la JTable.

    En espérant que ça puisse vous aider

  11. #11
    Membre habitué
    Homme Profil pro
    Passioné
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Par défaut
    Bonsoir Sharcoux,

    Un grand merci pour les précieux conseils. Avec tout cela, si je ne m'en sors pas...!
    Je vous tiens informé.... l'année prochaine!
    Bon réveillon à tous.
    Irish

  12. #12
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Tu connais le nombre de colonnes de ta JTable, tu arrives parfaitement à récupérer les informations que tu souhaites insérer dans ta JTable. Et maintenant qu'est ce qui te manque encore si pas appeler la méthode d'insertion de données dans les cases de JTable en indiquant les indices(ligne, colonne) de chacun des éléments. Sinon tu utilises NetBeans ou Eclipse?
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  13. #13
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Citation Envoyé par Irishamrock Voir le message
    Bonjour kevin254kl,

    C'est justement ce que j'essaie de faire, d'inclure mes données dans le tableau que j'ai formulé.
    Comment "transférer" mes "System.out.print()" dans les cellules?
    Si je t'ai bien saisie, tu souhaites voir le resulat dans la JTable. Si tel est le cas, sous NetBeans tu insères ta JTable dans la JFrame, tu renseignes les valeurs des propriétés pertinentes telle que nombre de colonne (3 comme tu avais dit)...
    Allons directement dans le code. Dans cet exemple, tout se passe dans le constructeur de la JFrame.
    - Récupérer le modèle de la JTable (avec tab_peripherique le nom de la JTab:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Récuperer le model de la JTable
    DefaultTableModel model = (DefaultTableModel) tab_peripherique.getModel();
    - Supprimer toutes les lignes par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Supprimer toutes les lignes
    model.setRowCount(0);
    - Enfin, remplissage de la JTable en s'appuyant sur son modèle et en ajoutant les lignes dynamiquement
    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
     
            //Charger la liste de Racines
            File[] racines = File.listRoots();
            //Indice pour parcourir les ligne de la JTable
            int indice = 0;
            int giga = 1073741824;
            //Pour toute racine contenue dans la liste des racines, récupérer ses informations pour remplir chaque ligne se la JTable
            for (File racine : racines) {
                //Ajouter une ligne de manière dynamique
                model.addRow(new Object[]{""});
     
                //Remplir la colonne "sélection" par un boolean (par défaut false)
                model.setValueAt(false, indice, 0);
               //Remplir la colonne "Péripherique" par le nom de la racine
                model.setValueAt(racine, indice, 1);
               //Remplir la colonne "Capacité" par l'espace total calculé
                double nbregiga = Math.round((double) racine.getTotalSpace() / giga);
                model.setValueAt(nbregiga, indice, 2);
               //Incrémenter l'indice
                indice++;
            }
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  14. #14
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Sincèrement : les tableaux de tableaux et le DefaultTableModel ca craint un max.
    C'est pas une vrai structure de données et c'est la galère à manipuler. Sans compter que le moindre changement peut tout casser.


    Il vaut mieux faire de la POO et créer un type qui va représenter chaque ligne du tableau. Par exemple :
    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
    class DiskInfo {
    	private boolean selected;
    	private String label;
    	private long size;
     
    	public boolean isSelected() {
    		return selected;
    	}
     
    	public void setSelected(boolean selected) {
    		this.selected = selected;
    	}
     
    	public String getLabel() {
    		return label;
    	}
     
    	public void setLabel(String label) {
    		this.label = label;
    	}
     
    	public long getSize() {
    		return size;
    	}
     
    	public void setSize(long size) {
    		this.size = size;
    	}
    }

    Ensuite on se fait son propre TableModel en héritant d'AbstractTableModel (et non pas le DefaultTableModel).
    C'est pas bien méchant :
    • Il y a 3 méthodes à implémenter obligatoirement : getRowCount() pour retourner le nombre de ligne, getColumnCount() pour retourner le nombre de colonne, et getValueAt().
    • On peut également implémenter getColumnName() pour avoir des noms de colonnes (au lieu de A, B, C...) et getColumnClass() si on veut optimiser l'affichage des cellules selon leurs types.
    • Enfin optionnellement isCellEditable() et setValueAt() permettent d’autoriser la modification des valeurs.

    On peut gérer le tout via une liste, en rajoutant des méthodes pour ajouter des éléments :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    class DiskInfoTableModel extends AbstractTableModel {
     
    	private final String[] names = { "Selection", "Label", "Taille" };
    	private final List<DiskInfo> values = new ArrayList<DiskInfo>();
     
     
    	@Override
    	public int getRowCount() {
    		return values.size();
    	}
     
    	@Override
    	public int getColumnCount() {
    		return names.length;
    	}
     
    	@Override
    	public Object getValueAt(int rowIndex, int columnIndex) {
    		DiskInfo info = this.values.get(rowIndex);
    		switch(columnIndex) {
    		case 0: return info.isSelected();
    		case 1: return info.getLabel();
    		case 2: return info.getSize();
    		}
    		throw new IllegalStateException("Invalid columIndex : " + columnIndex);
    	}
     
    	@Override
    	public String getColumnName(int column) {
    		return names[column];
    	}
     
    	@Override
    	public Class<?> getColumnClass(int columnIndex) {
    		switch(columnIndex) {
    		case 0: return Boolean.class;
    		case 1: return String.class;
    		case 2: return Long.class;
    		}
    		throw new IllegalStateException();
    	}
     
    	@Override
    	public boolean isCellEditable(int rowIndex, int columnIndex) {
    		switch (columnIndex) {
    		case 0: return true;
    		}
    		return false;
    	}
     
    	@Override
    	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    		if (isCellEditable(rowIndex, columnIndex)) {
    			DiskInfo info = this.values.get(rowIndex);
    			switch(columnIndex) {
    			case 0: info.setSelected((Boolean)aValue); break;
    			}
    			fireTableRowsUpdated(rowIndex, rowIndex);
    		}
    	}
     
    	public void add(DiskInfo info) {
    		int row = getRowCount();
    		this.values.add(info);
    		// On génère l'évènement pour mettre à jour l'affichage :
    		fireTableRowsInserted(row, row);
    	}
     
    	public void addAll(List<DiskInfo> infos) {
    		int row = getRowCount();
    		this.values.addAll(infos);
    		// On génère l'évènement pour mettre à jour l'affichage :
    		fireTableRowsInserted(row, getRowCount()-1);
    	}
    }


    Reste plus qu'à remplir le modèle avec des données (de préférence dans un SwingWorker pour éviter de bloquer l'UI), et éventuellement à adapter des CellRenderer pour améliorer l'affichage :
    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
    31
    32
    33
    34
    35
    36
    		DiskInfoTableModel model = new DiskInfoTableModel();
    		new SwingWorker<Void, DiskInfo>() {
    			@Override
    			protected Void doInBackground() throws Exception {
    				FileSystemView view = FileSystemView.getFileSystemView();
    				for (File racine : File.listRoots()) {
    					DiskInfo info = new DiskInfo();
    					info.setSelected(false);
    					String label = view.getSystemDisplayName(racine);
    					if (label.isEmpty()) {
    						label = racine.toString();
    					}
    					info.setLabel(label);
    					info.setSize(racine.getTotalSpace());
    					publish(info);
    				}
    				return null;
    			}
    			@Override
    			protected void process(List<DiskInfo> chunks) {
    				model.addAll(chunks);
    			}
    		}.execute();
     
    		JTable table = new JTable();
    		table.setModel(model);
     
    		JScrollPane scrollPane = new JScrollPane(table);
    		scrollPane.setPreferredSize(new Dimension(800,600));
     
    		JFrame frame = new JFrame("Exemple"); 
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setContentPane(scrollPane);
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);


    a++

  15. #15
    Membre habitué
    Homme Profil pro
    Passioné
    Inscrit en
    Février 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Février 2014
    Messages : 11
    Par défaut
    Merci infiniment pour vos conseils, disponibilités et aides... je vais éplucher et tester cela dès demain et vous tiens au courant, car aujourd'hui, je bosse toute la journée/nuit.
    @ demain (ou devrais je dire, à l'année prochaine...!)

Discussions similaires

  1. afficher le résultat d'une requete dans une datagrid
    Par awatif dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/09/2006, 15h57
  2. Réponses: 7
    Dernier message: 21/09/2006, 09h44
  3. [SQL] Est-il possible d'afficher le résultat d'une requête dans un cadre
    Par dessinateurttuyen dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/07/2006, 18h52
  4. Réponses: 11
    Dernier message: 20/06/2006, 12h10
  5. Réponses: 3
    Dernier message: 25/11/2005, 15h51

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