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

 Java Discussion :

remplissage Jtable mvc


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Par défaut remplissage Jtable mvc
    bjr,
    je souhaite remplir une jtable avec partir un fichier texte et à partir d'une fenetre JFileChooser. Ma JTable contiendra une liste de logiciels. Elle implemente "observer" (update(observer,object))

    J'utilise un modele qui lira le fichier texte et ecrira sur le fichier les fichier ouvert par le JFileChooser.(fichier de sauvegarde de noms de logiciels)

    j'utilise un "modeletable" qui herite de AbstractTableModel pour la mise en forme de ma jtable

    dans ma modeletable j'ai implenté la methode getValueAt() que j'utilise dans la fonction update de la class VueTable

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    package installationLogiciels;
     
    import java.util.Iterator;
    import java.util.*;
     
    import javax.swing.*;
    import javax.swing.table.AbstractTableModel;
     
    public class AdaptateurVueTable extends AbstractTableModel{
     
    	private Modele modele ;
     
    	public AdaptateurVueTable(Modele modele){
    		this.modele = modele ;
    	}
     
    	public int getRowCount(){
     
    		return 20; }
     
     
    	public int getColumnCount(){
    		return 1 ;}
     
    	public String getColumnName(int index) {
    		return "liste des logiciels" ;
    	}
     
     
    	public Object getValueAt(int row, int column){
    		HashMap logiciels = modele.getLogiciels() ;
    		Set cles = logiciels.keySet();
    		Iterator it = cles.iterator();
    		int i = 0;
    		String cle = null;
    		while (it.hasNext() && i != row){
    			cle = (String)it.next();
                            i++;
     
    		}
    		System.out.println(" adapt   "+cle);
    		return cle ;
    	}
     
    }
     
    package installationLogiciels;
     
    import java.util.* ;
    import javax.swing.* ;
    import javax.swing.border.*;
    import java.awt.* ;
     
     
    public class VueTable extends JScrollPane implements Observer {
     
    	private Modele modele ;
    	private AdaptateurVueTable adapt ;
    	private JTable table;
     
     
    	public VueTable(Modele modele,AdaptateurVueTable adapt){
    		super();
    		this.setBorder(LineBorder.createGrayLineBorder());
    		this.modele = modele ; 
    		this.adapt = adapt ;
    		table = new JTable(adapt) ; 
     
    		this.table.setShowGrid(true);
    		this.table.setCellSelectionEnabled(true);
    		this.setViewportView(table);
     
     
     
     
     
     
    	modele.addObserver(this);
    	update(modele,null);
     
    	}//VueListe(Modele, Adaptateur)
     
    public void update(Observable o, Object arg){
    	if (o instanceof Modele){
    		// int[] 	getSelectedRows() 
    		HashMap logiciels = this.modele.getLogiciels();
    		Set cles = logiciels.keySet();
    		Iterator it = cles.iterator();
    		int i = 0;
    		String cle = (String)it.next();
    		while (it.hasNext()){
    		this.table.setValueAt(cle,i,0);
    		cle = (String)it.next();
    		i++;
    		}//for
     
    	}
    }
    }//class
    ma jtable est rempli du nom du premier logiciel qui est ds le fichier texte
    pourquoi ? pouvez vous m aider, faut t il utiliser la methode fireTableCellUpdated
    merci

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ta méthode dans le cas présent est un peu bancale. En effet tu redéfinis (pas de la meilleure des façons, j'y reviendrais plus tard) la méthode getValueAt du modèle pour afficher les données issues de la référence sur la classe Modele .
    Toutefois tu n'as absolument pas redéfinit sa contrepartie, à savoir la méthode setValueAt pour modifier ce instance de Modèle.

    De fait tes modifications ne seront jamais affichée.

    Tu dois donc redéfinir la méthode setValueAt pour qu'elle modifie l'instance de Modele de ta classe AdaptateurVueTable. Cette méthode setValueAt doit finir par appeler la méthode fireTableRowsUpdated(int firstRow, int lastRow) pour notifier à la JTable que les données ont changé.

    Ensuite en ce qui concerne ta méthode getValueAt, l'utilisatino d'itérateurs est vraiment à éviter, car elle a un coût relativement élevé.

    Tu ferais mieux d'utiliser une collection implémentant l'interface RandomAccess permettant d'accéder en direct à tel ou tel index. L'exemple type de Collection en RandomAccess étant l'ArrayList, ou tu pourras accéder à l'élément d'index i pour un coût minimal.

  3. #3
    Membre éclairé Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Par défaut
    avec une arraylist je ne peux pas avoir la n ieme cle ?

  4. #4
    Membre éclairé Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Par défaut
    en ce qui concerne la methode setValueAt je ne vois pas trop à quoi elle sert.

    en appuyant sur le bouton ajouter de la classe bouton j ajoute un logiciel dans la liste des logiciels de ma classe modele. la methode ajouter() de la classe modele appelle ma methode update de ma classe vuetable( JTable de nom de logiciels)

    je suis bloque, je viens de remettre en java

    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
     
    package installationLogiciels;
     
    import java.util.* ;
    import java.io.* ;
    import javax.swing.*;
     
    public class Modele extends Observable {
     
    	private HashMap logiciels ; //nom logiciel + chemin acces 
    	private FileReader flot ;
    	private BufferedReader flotFiltre ;
     
    	public Modele() {
    		super() ;
    		logiciels = new HashMap();
     
    		//lecture fichier + initialisation HashMapLogiciels
    		try {
    		flot = new FileReader("liste_logiciels.txt");
     
    		flotFiltre = new BufferedReader(flot);
    		String ligne = flotFiltre.readLine() ;
    		String nom ;
    		String cheminLogiciel ;
     
    		while (ligne != null) {
    			nom = ligne;
    			cheminLogiciel = flotFiltre.readLine();
     
    			logiciels.put(nom, cheminLogiciel); 
    			System.out.println(nom+" "+cheminLogiciel);
    			ligne = flotFiltre.readLine() ;
     
    		}//while
    		flotFiltre.close();
    		notifyObservers();
    		setChanged() ;
    		}//try
    		catch(IOException e){
    			JOptionPane.showMessageDialog(null,e.getMessage(),
    					"Alerte",JOptionPane.ERROR_MESSAGE) ;
     
    		}//catch
    	}//constructeur
     
    		public HashMap getLogiciels() {
    			return logiciels ;
    		}
     
    		public void ajouterLogiciels(String nom, String chemin){
    			logiciels.put(nom,chemin);
    			notifyObservers();//peu etre metre nom en argument
    			setChanged() ;
     
    		}
     
    		public void supprimerLogiciels(String nom){
    			logiciels.remove(nom);
    			System.out.println(" suppr "+nom);
    			notifyObservers();
    			setChanged() ;
    		}
     
    	}//class
    classe de boutons

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
     
    package installationLogiciels;
     
    import javax.swing.* ;
    import java.awt.* ;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.net.URL ;
    import java.util.* ;  
    import javax.swing.filechooser.FileSystemView ;
     
     
    public class VueBoutons extends JPanel  {//implements Observer {
     
    	private Modele modele ;
     
    	private JButton ajouter ;
    	private JButton enlever ;
    	private JButton installer ;
     
    	private URL imgAjouterURL = VueBoutons.class.getResource("icones/ajouterListe.png");
    	private URL imgEnleverURL = VueBoutons.class.getResource("icones/enleverListe.png");
    	private URL imgInstallerURL = VueBoutons.class.getResource("icones/installer.png");
     
    	private GridLayout listeBoutons ;
     
    	public VueBoutons(Modele modele) {
     
    		super();
    		this.modele = modele ; 
     
    		listeBoutons = new GridLayout(1,3);
    		setLayout(listeBoutons);
     
    		ajouter = new JButton(new ImageIcon(imgAjouterURL));
    		enlever = new JButton(new ImageIcon(imgEnleverURL));
    		installer = new JButton(new ImageIcon(imgInstallerURL));
     
    		ajouter.addActionListener(new Charger(modele));
    		//.......
    		//enlever.addActionListener(new ActionListener() {
    		//	public void actionPerformed(ActionEvent e){}
    		//}
    		//	);
     
     
    		//installer.addActionListener(..
    		this.add(ajouter);
    		this.add(enlever);
    		this.add(installer);
     
    		//modele.addObserver(this);
    		//update(null,null);
     
    	}//VueBoutons(Modele)
     
    	//public void update(Observable o, Object arg){}
     
    	public class Charger implements ActionListener {
    		private Modele modele ; 
     
    		public Charger(Modele modele) {
    		    this.modele = modele;
    		}
    		public void actionPerformed(ActionEvent e) {
    		    JFileChooser chooser;
    		    try {
    			chooser = new JFileChooser();
    			//FileSystemView vueSysteme = FileSystemView.getFileSystemView(); 
     
     
    			// File la ou on est + definition du repertoir par default
    			File f = new File(new File("\\\\mercure\\Utilitaires").getCanonicalPath());
    			chooser.setCurrentDirectory(f);
     
    			int returnVal = chooser.showOpenDialog(null);
    			if (returnVal == JFileChooser.APPROVE_OPTION) {
     
    				String nom = chooser.getSelectedFile().getName();
    				String chemin = chooser.getSelectedFile().getCanonicalPath();
    			    modele.ajouterLogiciels(nom,chemin);
     
     
    			}//if (returnVal 
    		    }//try
    		    catch (FileNotFoundException err) { JOptionPane.showMessageDialog(null,err.getMessage(),"erreur",JOptionPane.ERROR_MESSAGE); }
    		    catch (IOException err) { JOptionPane.showMessageDialog(null,err.toString(),"erreur",JOptionPane.ERROR_MESSAGE); }
    		    catch (NumberFormatException err) { JOptionPane.showMessageDialog(null,err.getMessage(),"erreur",JOptionPane.ERROR_MESSAGE); }
    		}//catch
     
    	    }
     
     
     
     
    	}
    class vuetable

    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
     
    package installationLogiciels;
     
    import java.util.* ;
    import javax.swing.* ;
    import javax.swing.border.*;
    import java.awt.* ;
     
     
    public class VueTable extends JScrollPane implements Observer {
     
    	private Modele modele ;
    	private AdaptateurVueTable adapt ;
    	private JTable table;
     
     
    	public VueTable(Modele modele,AdaptateurVueTable adapt){
    		super();
    		this.setBorder(LineBorder.createGrayLineBorder());
    		this.modele = modele ; 
    		this.adapt = adapt ;
    		table = new JTable(adapt) ; 
     
    		this.table.setShowGrid(true);
    		this.table.setCellSelectionEnabled(true);
    		this.setViewportView(table);
     
     
    	modele.addObserver(this);
    	update(modele,null);
     
    	}//VueListe(Modele, Adaptateur)
     
    public void update(Observable o, Object arg){
    	if (o instanceof Modele){
     
     
    		//if(arg != null) pour ajouter un logiciel
    			//this.table.setValueAt(arg.toString,cull,0)
    		//intialisation de la table avec le fichier historique des logiciels 
    		//precedement ajouter
     
    		System.out.println("mise a jour");
    		// int[] 	getSelectedRows() 
    		HashMap logiciels = this.modele.getLogiciels();
    		Set cles = logiciels.keySet();
    		Iterator it = cles.iterator();
    		int i = 0;
    		String cle = (String)it.next();
    		while (it.hasNext()){
    			this.table.setValueAt(cle,i,0);
    			cle = (String)it.next();
    			i++;
    		}//while
     
    	}
    }
    }//class
    ma classe adapatateur vue de la table

    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
     
    package installationLogiciels;
     
    import java.util.Iterator;
    import java.util.*;
     
    import javax.swing.*;
    import javax.swing.table.AbstractTableModel;
     
    public class AdaptateurVueTable extends AbstractTableModel{
     
    	private Modele modele ;
     
    	public AdaptateurVueTable(Modele modele){
    		this.modele = modele ;
    	}
     
    	public int getRowCount(){
     
    		return 20; }
     
     
    	public int getColumnCount(){
    		return 1 ;}
     
    	public String getColumnName(int index) {
    		return "liste des logiciels" ;
    	}
     
     
    	public Object getValueAt(int row, int column){
    		HashMap logiciels = modele.getLogiciels() ;
    		//ArrayList list = logiciels.values();
     
    		Set cles = logiciels.keySet();
    		Iterator it = cles.iterator();
    		int i = 0;
    		String cle = null;
    		while (it.hasNext() && i != row){
    			cle = (String)it.next();
    			i++;
     
    		}
    		System.out.println(" adapt   "+cle);
    		return cle ;
    	}
     
    	public void setValueAt(Object nom,int l,int c){
    		modele.ajouterLogiciels(nom.toString(),
    				modele.getLogiciels().get(nom).toString() );
     
    		fireTableCellUpdated(modele.getLogiciels().size()-1, 0);
     
    	}
    }

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Le setValueAt est la méthode utilisée par la JTable pour modifier le modèle quand une modification est effectuée dans le composant.

    Donc grosso modo si tu utilises la méthode setValueAt, il faut que celle ci modifie la structure de données utilisée par le getValueAt pour récupérer les données.

  6. #6
    Membre éclairé Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Par défaut
    mon bouton ajouter de la classe VueBoutons modifie deja le modele...
    je dois appeler la methode setValueAt dans la methode update de la classe VueTable ?

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

Discussions similaires

  1. Blocage remplissage JTable
    Par peemoney dans le forum Général Java
    Réponses: 1
    Dernier message: 24/09/2012, 11h13
  2. probleme lors de remplissage jtable
    Par lordatef dans le forum Langage
    Réponses: 1
    Dernier message: 12/12/2011, 15h53
  3. Problème remplissage jtable
    Par afpaformation dans le forum Débuter
    Réponses: 9
    Dernier message: 31/01/2009, 03h38
  4. [JTable] Remplissage d'une JTable
    Par Ankya dans le forum Composants
    Réponses: 6
    Dernier message: 30/03/2005, 14h16
  5. [Swing]remplissage d'un JTable avec les vecteur
    Par 3adoula dans le forum Composants
    Réponses: 7
    Dernier message: 15/06/2004, 16h09

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