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 :

[JTable] Effacer une ligne : problème avec getSelectedRow


Sujet :

Composants Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Par défaut [JTable] Effacer une ligne : problème avec getSelectedRow
    Bonjour,

    Je sais que mon problème a déjà été posté plusieurs fois sur ce forum pour avoir lu plusieurs posts à ce sujet, mais aucune des réponses ne semble convenir au problème qu'il se pose pour moi.

    J'ai une JTable dans un JPanel qui a un modèle que je définis également.
    A la création du panel, je remplis automatiquement ma JTable et tout se passe très bien. Elle est composée des fichiers se trouvant dans un dossier et d'information les concernant. La table est remplie comme il faut, je peux double cliquer sur les lignes et les actions que j'ai défini se passent nickel... sauf sur un détail.
    La dernière colonne de ma table permet, via une petite image qui a un listener de défini, d'effacer la ligne sur laquelle se trouve la petite image si l'utilisateur clique dessus.

    J'ai essayé deux choses principales mais aucune d'elle ne fonctionne et me rendent deux résultats différents :
    1/ la méthode "propre" :
    Je passe tout simplement par les méthodes remove proposées. Mais cela ne fonctionne pas. La ligne n'est pas supprimée. Si j'essaye de cliquer à nouveau dessus, cela fait comme si la ligne existait toujours et que je n'avais fait strictement aucune modification. Le getRowSelected() rend la bonne valeur.

    2/ j'essaye de réinitialiser ma JTable
    Ici j'affecte de nouveau ma JTable de la même manière que je l'ai créée si je clique sur "supprimer". La ligne se supprime effectivement (encore heureux qu'il ne trouve pas le fichier qui a été supprimé en reparcourant le répertoire :p ), mais ensuite, impossible de sélectionner une seule des lignes de ma table, le getSelectedRow() me renvoie toujours -1.


    Voici le code de mes classes :

    Le panel qui contient la 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
    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
     
    public class Table extends JPanel {
    	private RowListener rl;
    	protected static String rscPath = ...;
    	protected static File [] mesFichiers=null;
     
    	// dimensions de la table
    	protected static Object[][] data=null;
    	protected static String[] columnNames={... noms des colonnes ...};
     
    	protected static DataTable table;
     
    	public Table(int width, int height) {
    		super(new GridLayout(1,0));
    		this.setPreferredSize(new Dimension(width,height));
     
    		// init du rowListener qui définit les évènements user sur la table
    		rl=new RowListener(this);
     
    		initTable();
     
    		JScrollPane scrollPane = new JScrollPane(table);
    		add(scrollPane);
    	}
     
    	/**
             * Parcours le dossier des ressources disponibles 
             */
    	public File[] findFiles(String path) {
    		...
    		//parcours du dossier : rien de bien passionnant ^^
    		...
    	}
     
    	/**
             * @param numero : numéro de la ligne sur laquelle se trouve le fichier dans la table pour lequel on a demandé la suppression
             */
    	public void deleteFile(int numero) {
    		// suppresion effective du pc de l'utilisateur du fichier sélectionné
    		new File(rscPath+mesFichiers[numero].getName()).delete();
     
    		// suppression de la liste "mes fichiers" qui sert à remplir la table
    		mesFichiers[numero].delete();
     
    		// on réinitialise la table : cas 1 dans mon explication
    		// pour le cas 2 : je vire les 4 lignes qui suivent et je remplace par initTable()
    		table.removeRowSelectionInterval(numero, numero);
    		table.model.fireTableRowsDeleted(numero, numero);
    		table.model.fireTableDataChanged();
    		table.revalidate();
     
    		repaint();
    	}
     
    	public void initTable(){
    		String nomFichier;
     
    		// on recense tous les fichiers dans le répertoire rscPath 
    		mesFichiers=findFiles(rscPath);
    		data=new Object[mesFichiers.length][columnNames.length];
     
    		// on parse chaque fichier et on remplie les lignes que l'on mettra dans la Table
    		for (int i=0; i<mesFichiers.length;i++) {
    			...
    			// boucle qui remplie le champ data
    			...
    		}
     
    		// création de la table avec le model associé
    		table=new DataTable(getAbstractModel(), rl);
     
    		repaint();
    	}
     
     
    	/**
             * Permet de définir l'abstract model de la table
             * @return retourne le modèle de la table
             */
    	public static AbstractTableModel getAbstractModel(){
     
    		return new AbstractTableModel() {
    			public int getColumnCount() { return columnNames.length; }
    			public int getRowCount()    { return data.length; }
    			public String getColumnName(int col) {
    				return (String)columnNames[col]; 
    			}
    			public Object getValueAt(int row, int col) { 
    				return data[row][col]; 
    			}
    			public Class getColumnClass(int col) {
    				if (col==columnNames.length-1 || col==0)
    					return ImageIcon.class;
    				else return super.getColumnClass(col);
    			}
    		};
    	}
    }

    Le RowListener qui permet d'écouter et de définir les actions des évènements souris :

    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
     
    public class RowListener implements MouseListener {
     
    	static Table tablePan;
     
    	public RowListener(Table table){
    		this.tablePan=table;
    	}
     
    	public void mouseClicked(MouseEvent e) {
    		if(tablePan.table.getSelectedColumn()==Table.columnNames.length-1) {
    			// on a sélectionné un fichier à effacer
    			if(JOptionPane.showConfirmDialog(null, LangParser.fichiersConfirmation)==0){
    				// l'utilisateur a choisi l'option "oui", on supprime donc le fichier
    				tablePan.deleteFile(tablePan.table.getSelectedRow());
    			}
     
    		}
    	}
    	public void mouseEntered(MouseEvent arg0) {}
    	public void mouseExited(MouseEvent arg0) {}
    	public void mousePressed(MouseEvent arg0) {}
    	public void mouseReleased(MouseEvent arg0) {}	
    }

    Le code de la 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
    18
    19
    20
     
    public class DataTable extends JTable {
     
    	AbstractTableModel model;
     
    	public DataTable(AbstractTableModel model, RowListener rl) {
    		super(model);
     
    		this.model=model;
     
    		// définition des propriétés de la table et construction de la table
    		setPreferredScrollableViewportSize(new Dimension(500, 70));
    		setFillsViewportHeight(true);
    		setColumnSelectionAllowed(false);
    		setShowVerticalLines(false);
    		getTableHeader().setReorderingAllowed(false);
    		setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    		addMouseListener(rl);
    	}
    }

    Je pense qu'il doit manquer un fireTable...quelque chose ou pas loin, mais je n'arrive pas à trouver.

    Si quelqu'un a une idée, elle serait la bienvenue

    Merci beaucoup par avance !

    Bonne soirée

  2. #2
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 29
    Par défaut
    par curiosité, dans ta solution 1 essaye de faire un getRowcount sur le model apres avoir supprimé la ligne (table.removeRowSelectionInterval(numero, numero)

    Je suppute que le tableau data du modele n'est pas correctement mis à jour
    sinon tu peux essayer un fireTableStructureChanged mais c plutot pour qd on supprime des colonnes mais ca ne coute rien d'essayer

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Par défaut
    Bonjour beuhnoix,

    Merci de ta réponse !

    Effectivement, ça garde exactement le même nombre de lignes avant et après le remove

    Hmm... Mais je peux y faire quoi au juste pour qu'il se mette à jour correctement ?
    Je dois avoir oublié quelques lignes ou en avoir mal placé parce que j'avoue que j'ai organisé mon code de manière un peu anarchique...

    Le fireTableStructureChanged ne change rien malheureusement. Si tu as une autre idée, ça sera avec grand plaisir ^^

  4. #4
    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
    Dans ce genre de cas c'est plutôt dans le modèle qu'il faut prévoir la fonctionnalité de suppression de ligne.
    Ce sue tu dois faire c'est coder une méthode removeRow(int lineNumber) dans ton modèle qui réalise la suppression de ligne dans le donnée et déclenche le fireRowsDeleted.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 25
    Par défaut
    Bonjour sinok,

    Merci beaucoup de ton intervention
    Le problème est résolu. J'ai un peu modifié ma classe Table et désormais, ça marche ^^ Un peu de rangement et j'ai appliqué vos conseils.

    Voici le code pour celles et/ou ceux que ça intéresserait :

    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
    101
    102
    103
    104
     
    public class Table extends JPanel {
    	private RowListener rl;
    	protected static String rscPath = ...;
    	protected static File [] mesFichiers=null;
     
    	// dimensions de la table
    	protected static Object[][] data=null;
    	protected static String[] columnNames={... noms des colonnes ...};
     
    	protected static DataTable table;
     
    	public Table(int width, int height) {
    		super(new GridLayout(1,0));
    		this.setPreferredSize(new Dimension(width,height));
     
    		// init du rowListener qui définit les évènements user sur la table
    		rl=new RowListener(this);
     
    		initTable();
     
    		JScrollPane scrollPane = new JScrollPane(table);
    		add(scrollPane);
    	}
     
    	/**
             * Parcours le dossier des ressources disponibles 
             */
    	public File[] findFiles(String path) {
    		...
    		//parcours du dossier : rien de bien passionnant ^^
    		...
    	}
     
    	/**
             * @param numero : numéro de la ligne sur laquelle se trouve le fichier dans la table pour lequel on a demandé la suppression
             */
    	public void deleteFile(int numero) {
    		// suppresion effective du pc de l'utilisateur du fichier sélectionné
    		new File(rscPath+mesFichiers[numero].getName()).delete();
     
    		// suppression de la liste "mes fichiers"
    		File [] temp= new File[mesFichiers.length-1];
    		boolean trouve=false;
    		//mesFichiers[numero].delete();
    		for (int i=0; i<mesFichiers.length;i++) {
    			if (i==numero) trouve=true;
    			if (i!=numero && !trouve) temp[i]=mesFichiers[i];
    			else if (i!=numero && trouve) temp[i-1]=mesFichiers[i];
    		}
    		mesFichiers=null;
    		mesFichiers=temp;
     
    		// on met à jour le modèle de la table
    		table.removeRowSelectionInterval(numero, numero);
    		table.model.removeRow(numero);
    		table.revalidate();
     
    		repaint();
    	}
     
    	public void initTable(){
    		... blabla ...
    	}
     
     
     
    	/**
             * Permet de définir l'abstract model de la table
             * @return retourne le modèle de la table
             */
    	class MyTableModel extends AbstractTableModel {
     
    		public int getColumnCount() { return columnNames.length; }
     
    		public int getRowCount()    { return data.length; }
     
    		public String getColumnName(int col) {
    			return (String)columnNames[col]; 
    		}
     
    		public Object getValueAt(int row, int col) { 
    			return data[row][col]; 
    		}
     
    		public Class getColumnClass(int col) {
    			if (col==columnNames.length-1 || col==0)
    				// colonnes contenant des images
    				return ImageIcon.class;
    			else return super.getColumnClass(col);
    		}
     
    		public void removeRow(int num){
    			Object[][] temp=new Object[mesFichiers.length-1][columnNames.length];
    			for (int i=0; i<mesFichiers.length;i++) {
    				if (i!=num) temp[i]=data[i];
    			}
    			data=null;
    			data=temp;
    			fireTableRowsDeleted(num, num);
    		}
    	}
     
    }

    merci encore pour vos réponses

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

Discussions similaires

  1. Effacer une ligne avec une combobox
    Par nicdodo dans le forum Excel
    Réponses: 1
    Dernier message: 28/07/2013, 16h34
  2. Probléme pour effacer une ligne dans ma combobox
    Par scorpionrun dans le forum VB.NET
    Réponses: 2
    Dernier message: 20/08/2009, 12h18
  3. Effacer une ligne avec bouton
    Par ptitepo dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 26/05/2008, 14h16
  4. [FSO] Effacer une ligne dans un fichier
    Par Johnbob dans le forum ASP
    Réponses: 4
    Dernier message: 30/05/2007, 17h23
  5. Effacer une ligne dans la table nat
    Par vbcasimir dans le forum Sécurité
    Réponses: 2
    Dernier message: 11/01/2004, 01h15

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