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 :

[Debutant] Gérer évenement JTable ayant editor


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut [Debutant] Gérer évenement JTable ayant editor
    Bonjour à ceux qui verront ce post!!

    Je suis débutant en Java et j'ai un ptit souci au niveau d'une application
    que je fais.
    J'ai une JTable à laquelle j'ai associé plusieurs editors que j'ai réussi tant b1 que mal à implémenter.
    Le problème est que quand je veux gérer des évènements telles le changement de la valeur d'une cellule, l'évènement n'est pas traité alors que ma classe implémente l'interface TableModelListener!!
    Ceci aurait-il un rapport avec les editors? Est-ce eux qui doivent gérer les évènements?
    Je ne sais pas si j'ai été clair, n'hésitez pas à me le dire!!

    Merci d'avance pour vos réponses.
    Cordialement.

  2. #2
    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 Re: [Debutant] Gérer évenement JTable ayant editor
    Salut,

    C'est la méthode getCellEditorValue() du TableCellEditor qui doit renvoyer nouvelle valeur à la fin de l'édition...
    Ensuite c'est la méthode setValueAt() de ton TableModel qui est utilisé pour modifier la valeur dans la table.

    Est-ce que tu as correctement implémenté ces méthodes ?

    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Merci pour ta réponse!
    Si je comprends bien, ma classe principale implémente son propre AbstractTableModel
    Celà donne quelque chose de ce genre
    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
     
    class MyOlympicModel extends AbstractTableModel{
    	private String[] nomColonnes;
    	private int nbColonnes;
    	private int nbLignes;
    	private Object[][] ligne;
    	private int[][] tabEditCell;
    	private Ihm frame;
     
    	public MyOlympicModel(Ihm frame, String[] nomColonnes,Object[][] ligne, int[][] tabEditCell)
    	{
    		super();
    		this.frame = frame;
    		this.nomColonnes = nomColonnes;
    		this.nbColonnes = ligne[0].length;
    		this.nbLignes = ligne.length;
    		this.ligne = ligne;
    		this.tabEditCell = tabEditCell;
    	}
     
    	public int getColumnCount() 
    	{
    		// TODO Auto-generated method stub
    		return nbColonnes;
    	}
     
    	public int getRowCount() {
    		// TODO Auto-generated method stub
    		return nbLignes;
    	}
     
    	public Object getValueAt(int numLigne, int numCol) {
    		// TODO Auto-generated method stub
     
    		// Prendre la valeur de l'objet
    		return ligne[numLigne][numCol];
    	}
     
    	public Class getColumnClass(int c)
    	{
    		return getValueAt(0,c).getClass();
    	}
     
    	public boolean isCellEditable(int rowIndex, int ColumnIndex)
    	{
    		System.out.print(tabEditCell[rowIndex][ColumnIndex]);
    		if (tabEditCell[rowIndex][ColumnIndex] == 1) return true;
    		else return false;
    	}
     
    	public void addRow (Object[][] o)
    	{
    		for (int i = 0; i < o.length-1; i++)
    		{
    			for (int j = 0; j < o[i].length; j++)
    			{
    				this.setValueAt(o[i][j],i,j);
    			}
    		}
    	}
     
    	public String getColumnName(int col)
    	{
    		return nomColonnes[col];
    	}
     
    	public void setValueAt(Object o,int numLigne, int numCol)
    	{
    		ligne[numLigne][numCol] = o;
    		//fireTableCellUpdated(numLigne, numCol);
    	}
    et à quel moment faire intervenir le getCellEditorValue()?
    Voici mon editor
    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
     
    public class ComboEditor extends JComboBox implements TableCellEditor{
     
    	private JComboBox combo;
    	private JTable jTable;
    	private Ihm frame;
     
    	public ComboEditor(Ihm frame)
    	{
    		combo = new JComboBox();
    		this.frame = frame;
    	}
     
    	public Component getTableCellEditorComponent(JTable jTable, Object contenuCell,
    			boolean isSelected, int numLigne, int numCol) 
    	{
    		JComboBox combo = new JComboBox();
    		this.jTable = jTable;
    		// TODO Auto-generated method stub
     
    		// Générer la liste du comboBox
    		String nomColonne = jTable.getColumnName(numCol);
    		if ("NomDelegation".equals(nomColonne))
    		{
    			String requete = "SELECT NomDelegation FROM Delegation ORDER BY NomDelegation ASC";
    			String requeteCompte = "SELECT COUNT('NomDelegation') FROM Delegation";
    			combo = getListe(requete, requeteCompte);
    		}
    		else if("Sexe".equals(nomColonne))
    		{
    			combo.addItem("F");
    			combo.addItem("M");
    		}
    		else if("NomLogement".equals(nomColonne))
    		{
    			String requete = "SELECT NomLogement FROM Logement ORDER BY NomLogement ASC";
    			String requeteCompte = "SELECT COUNT('NomLogement') FROM Delegation";
    			combo = getListe(requete, requeteCompte);
    		}
    		this.combo = combo;
     
    		return this.combo;
    	}
     
    	public Object getCellEditorValue() {
    		// TODO Auto-generated method stub
    		return combo.getSelectedItem();
    	}
     
    	public boolean shouldSelectCell(EventObject evt) {
    		// TODO Auto-generated method stub
    		if (evt instanceof MouseEvent) { 
                MouseEvent e = (MouseEvent)evt;
                return e.getID() != MouseEvent.MOUSE_DRAGGED;
            }
            return true;
    	}
     
    	public boolean isCellEditable(EventObject evt) 
    	{
    		// TODO Auto-generated method stub
    		return true;
    	}
     
    	public boolean stopCellEditing() {
    		// TODO Auto-generated method stub
    		/*if (combo.isEditable()) {
    		    // Commit edited value.
    		    combo.actionPerformed(new ActionEvent(
    				     this, 0, ""));
    		}*/
    		return true;
    	}
     
    	public void cancelCellEditing() {
    		// TODO Auto-generated method stub
     
    	}
     
    	public void addCellEditorListener(CellEditorListener arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	public void removeCellEditorListener(CellEditorListener arg0) {
    		// TODO Auto-generated method stub
     
    	}
    }
     
    getListe étant une fonction permettant de remplir une JComboBox de valeurs.

  4. #4
    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
    Il faut que tu gères les CellEditorListener en implémentes lant méthodes addCellEditorListener() et removeCellEditorListener, et en envoyant les bons évenements. Ces méthodes permettent à une classe de se tenir informer de l'état de l'editeur en étant avertit lorsque l'édition est annulée ou terminé.

    Si tu ne gère pas les CellEditorListener la JTable n'est pas au courant de la fin de l'édition et ne mets pas à jours les valeurs...

    Ce n'est pas très compliqué et le code est généralement toujours le même, cette exemple de la FAQ montre comment gérer les méthode addXXXListener() et removeXXXListener() : Comment créer son propre Listener ?.
    Ensuite il faut faire autant de fireXXXXEvent() qu'il y a d'evenement différents à lancer (dans ton cas fireEditorStopped() et fireEditorCancelled() par exemple) et de les utiliser quand c'est neccessaire...

    Maintenant je te conseille d'hériter d'DefaultCellEditor qui implémente déjà toutes ces méthodes... surtout qu'il n'y a pas de raison que tu hérite de JComboBox puisque tu utilises une autre JComboBox pour l'affichage...

    a++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Humm dsl mais je suis débutant ,

    en fait j'ai du mal à voir quelles classes doit implémenter DefaultCellEditor() et où mettre les firexxxEvent()

    J'essaie de comprendre, dîtes moi si je me trompe,
    Ma classe ComboEditor doit donc implémenter DefaultCellEditor, par contre si c'est le cas je ne peux pas lui passer ma frame en paramètre comme j'ai fait précedemment.
    Merci d'avance.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    J'avoue que j'ai un peu de mal à comprendre!
    Après avoir implémenter l'interface que j'ai crée comment liée tout celà à ma jTable situé dans ma classe principale
    Voici mon comboEditor modifié
    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    public class ComboEditor extends JComboBox implements TableCellEditor, TableModelListener {
     
    	private JComboBox combo;
    	private JTable jTable;
    	private Ihm frame;
    	protected EventListenerList listenerList;
     
    	public ComboEditor(Ihm frame)
    	{
    		combo = new JComboBox();
    		this.frame = frame;
    		/** instanciation nécessaire : (à faire dans son constructeur
                     * ou dans une méthode appelée par le constructeur)
                     */
    		this.listenerList = new EventListenerList ();
    	}
     
    	public Component getTableCellEditorComponent(JTable jTable, Object contenuCell,
    			boolean isSelected, int numLigne, int numCol) 
    	{
    		JComboBox combo = new JComboBox();
    		this.jTable = jTable;
    		// TODO Auto-generated method stub
     
    		// Générer la liste du comboBox
    		String nomColonne = jTable.getColumnName(numCol);
    		if ("NomDelegation".equals(nomColonne))
    		{
    			String requete = "SELECT NomDelegation FROM Delegation ORDER BY NomDelegation ASC";
    			String requeteCompte = "SELECT COUNT('NomDelegation') FROM Delegation";
    			combo = getListe(requete, requeteCompte);
    		}
    		else if("Sexe".equals(nomColonne))
    		{
    			combo.addItem("F");
    			combo.addItem("M");
    		}
    		else if("NomLogement".equals(nomColonne))
    		{
    			String requete = "SELECT NomLogement FROM Logement ORDER BY NomLogement ASC";
    			String requeteCompte = "SELECT COUNT('NomLogement') FROM Delegation";
    			combo = getListe(requete, requeteCompte);
    		}
    		this.combo = combo;
     
    		return this.combo;
    	}
     
    	public Object getCellEditorValue() {
    		// TODO Auto-generated method stub
    		return combo.getSelectedItem();
    	}
     
    	public boolean shouldSelectCell(EventObject evt) {
    		// TODO Auto-generated method stub
    		if (evt instanceof MouseEvent) { 
                MouseEvent e = (MouseEvent)evt;
                return e.getID() != MouseEvent.MOUSE_DRAGGED;
            }
            return true;
    	}
     
    	public boolean isCellEditable(EventObject evt) 
    	{
    		// TODO Auto-generated method stub
    		return true;
    	}
     
    	public boolean stopCellEditing() {
    		// TODO Auto-generated method stub
    		/*if (combo.isEditable()) {
    		    // Commit edited value.
    		    combo.actionPerformed(new ActionEvent(
    				     this, 0, ""));
    		}*/
    		return true;
    	}
     
    	public void cancelCellEditing() {
    		// TODO Auto-generated method stub
     
    	}
     
    	/* (non-Javadoc)
    	 * @see javax.swing.CellEditor#addCellEditorListener(javax.swing.event.CellEditorListener)
    	 */
    	public void addCellEditorListener(CellEditorListener l) {
    		// TODO Auto-generated method stub
     
    	}
     
    	/* (non-Javadoc)
    	 * @see javax.swing.CellEditor#removeCellEditorListener(javax.swing.event.CellEditorListener)
    	 */
    	public void removeCellEditorListener(CellEditorListener l) {
    		// TODO Auto-generated method stub
     
    	}
     
    	public void addCellEditorListener(EditorListener el) {
    		// TODO Auto-generated method stub
    		this.listenerList.add(EditorListener.class, el);
    	}
     
    	public void removeCellEditorListener(EditorListener el) {
    		// TODO Auto-generated method stub
    		this.listenerList.remove(EditorListener.class, el);
    	}
     
    	public void fireEditorStopped()
    	{
    	        EditorListener [] listeners = (EditorListener []) listenerList.getListeners( EditorListener.class);
    	        EventObject e = new EventObject (this);
    	        for (int i = listeners.length-1; i>=0; i--) {
    	                listeners [i].editorStopped(e);
    	        }
    	}
     
    	public void fireEditorCanceled()
    	{
    		EditorListener [] listeners = (EditorListener []) listenerList.getListeners( EditorListener.class);
            EventObject e = new EventObject (this);
            for (int i = listeners.length-1; i>=0; i--) {
                    listeners [i].editorCanceled(e);
            }
    	}...
    Et ma classe principale implemente les méthodes de mon interface EditorListener

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface EditorListener extends EventListener {
    	public void editorStopped (EventObject e);
        public void editorCanceled (EventObject e);
    }
    et voilà comment j'ai lié le tout dans ma classe principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ComboEditor comboEditor = new ComboEditor(this);
    		comboEditor.addCellEditorListener(this);
    		jTablePrincipale.setDefaultEditor(JComboBox.class, comboEditor);
    Mais j'ai du rater quelque chose car celà ne fonctionne pas!!
    Quand je clique dans la combo rien ne se passe!!
    Je voudrais juste savoir si c'est bien la méthode pour régler ce problème.
    et à quel moment faire le fireEditorStopped.
    Pouvez-vous m'aider svp?

  7. #7
    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
    Citation Envoyé par mrjoh
    Humm dsl mais je suis débutant ,

    en fait j'ai du mal à voir quelles classes doit implémenter DefaultCellEditor() et où mettre les firexxxEvent()
    Les méthodes fireXXXevent() doivent être appellé lorsque l'éenement qu'elle lance se produit. Par exemple pour le listener CellEditorListener, il y a deux evenement qui annonce que l'édition est annulée ou terminé... Il faut donc que tu les appelles dans les méthodes stopCellEditing() et cancelCellEditing(). Mais si tu hérite de DefaultCellEditor ou AbstractCellEditor c'est déjà le cas...

    Citation Envoyé par mrjoh
    Ma classe ComboEditor doit donc implémenter DefaultCellEditor, par contre si c'est le cas je ne peux pas lui passer ma frame en paramètre comme j'ai fait précedemment.
    C'est parce que lorsque tu hérites tu fais appel automatiquement au constructeur vide de la classe dont tu hérites. Or DefaultCellEditor n'a pas de constrcuteur vide donc tu dois spécifier lequels tu utilises avec super(), par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class ComboEditor extends DefaultCellEditor {
     
    	Ihm frame;
     
    	public ComboEditor (Ihm frame) {
    		super (new JComboBox());
    		this.frame = frame;
    	}
    DefaultCellEditor accepte en paramètre un JComboBox (entre autres...).

    Par contre j'ai répondu un peu trop vite, il est peut-être plus simple d'hérité d'AbstractCellEditor et d'impémenter TableCellEditor.
    AbstractCellEditor définit la plupart des méthodes (et gère les Listener). Il ne te reste donc plus qu'à écrire la méthode getTableCellEditorComponent() et getCellEditorValue().

    Enfin quelques remarques :
    Ta méthode getListe() renvoi un JComboBox, et du coup tu crées plusieurs JComboBox à chaque fois que tu modifies une cellule. Ce serait mieux si ta méthode getListe() renvoyait un String[] par exemple. Il te suffit ensuite de vider la JComboBox et de la remplir avec la liste des éléments du tableau retourné par getListe().
    Tu pourrais sauvegarder à chaque fois le nom de la colonne. Comme ca si la même colonne est édité deux fois tu n'as pas besoin de vider le JCombox et de le re-remplir puisque tu as déjà les bonnes valeurs...
    Il faut que tu renseignes ton JComboBox sur l'index de l'éléments courant sinon tu le perds à chaque fois que tu édite une cellule, il suffit pour cela d'utiliser le Model du JComboBox...


    Cela pourrait donner :
    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
    public class ComboEditor extends AbstractCellEditor implements TableCellEditor {
     
    	public static final String[] SEXE = new String[]{"F","M"};
     
    	private JComboBox combo;
    	private String last = "";
    	private JFrame frame;
     
    	public ComboEditor(JFrame frame)
    	{
    		combo = new JComboBox();
    		this.frame = frame;
    	}
     
    	public Component getTableCellEditorComponent(JTable jTable, Object contenuCell,
    			boolean isSelected, int numLigne, int numCol)
    	{
    		// Générer la liste du comboBox
    		String nomColonne = jTable.getColumnName(numCol);
     
    		// Si le colonne courante est différente de la dernière colonne
    		if ( ! this.last.equals(nomColonne) ) {
    			// on vide la JComboBox
    			this.combo.removeAllItems();	
    			String[] data = null;
     
    			// On effectue les requetes selon le nom de la colonne :
    			if ("NomDelegation".equals(nomColonne))
    			{
    				String requete = "SELECT NomDelegation FROM Delegation ORDER BY NomDelegation ASC";
    				String requeteCompte = "SELECT COUNT('NomDelegation') FROM Delegation";
    				data = getListe(requete, requeteCompte);
    			}
    			else if("Sexe".equals(nomColonne))
    			{
    				data = SEXE;
    			}
    			else if("NomLogement".equals(nomColonne))
    			{
    				String requete = "SELECT NomLogement FROM Logement ORDER BY NomLogement ASC";
    				String requeteCompte = "SELECT COUNT('NomLogement') FROM Delegation";
    				data = getListe(requete, requeteCompte);
    			}
    			// Si data n'est pas null
    			if (data!=null) {
    				// On parcours tous les éléments
    				for (int i=0; i<data.length; i++) {
    					// On ajoute au combobox
    					this.combo.addItem(data[i]);
    				}
    			}
    			// et on 'sauvegarde' le nom de la colonne :
    			this.last = nomColonne;
    		}
     
    		// On selectionne le bon item du JComboBox
    		this.combo.getModel().setSelectedItem(contenuCell);
     
    		return this.combo;
    	}
     
    	public Object getCellEditorValue() {
    		return combo.getSelectedItem();
    	}
     
    	// Pas besoin de redéfinir les autres méthodes
    	// (a moins de vouloir rajouter un traitement spécifique).
    }
    Enfin, si tes requêtes SQL renvoit toujours les mêmes valeur (si elle ne change pas souvant), tu pourrais conserver le résultat et ainsi éviter d'effectuer plusieurs fois la même requete...

    a++ et bon courage...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Encore un peu d'aide!!
    J'ai essayé de suivre ce que tu m'as dit, mais j'ai cependant un problème!!
    Quand je lie mon application à mon comboEditor, je le fais de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ComboEditor comboEditor = new ComboEditor(this);
    		comboEditor.addCellEditorListener(this);
    		jTablePrincipale.setDefaultEditor(JComboBox.class, comboEditor);
    Il me lève une exception de type : java.lang.NullPointerException
    at com.cyberlog.formation.gui.ComboEditor.addCellEditorListener(ComboEditor.java:101)
    Comment faire?
    Car quand je l'enlève, le programme se lance mais les comboBox ne sont plus affichées qand je clique dessus!!

    PS: Au fait par ce moyen je lève bien un évenement dans n'importe quel cellule de type JComboBox, c bien ça. Pour l'avoir dans d'autres cellules de types différents, je dois également créer des editors, du genre DateEditor ou autre c bien ça!!
    Je veux en fait cliquer sur n'importe quelle cellule changer sa valeur et récupérer la valeur changée dans un objet!!
    Merci d'avance!!

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Encore une question,

    J'ai bien compris que les méthodes fireEditingStopped et fireEditingCanceled se mettait après editingStopped et editingCanceled méthodes situées dans mon application principale!
    Cependant si l'on veut faire un fireEditingStopped ou fireEditingCanceled après avoir fait le traitement comment lancer ces méthodes vu que ces méthodes sont liées à un comboEditor et non à ma Jframe?
    Merci pour votre aide!

  10. #10
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          comboEditor.addCellEditorListener(this);
    Je ne sais pas à quoi correspond this mais tu n'a pas besoin d'ajouter de Listener à ton editeur (il faut juste que tu les gère).
    De plus je ne comprend pas la raison du NullPointerException. Est-ce que cela se produit avec le code que je t'ai donné ?

    Citation Envoyé par mrjoh
    J'ai bien compris que les méthodes fireEditingStopped et fireEditingCanceled se mettait après editingStopped et editingCanceled méthodes situées dans mon application principale!
    Non, les méthodes fireEditingStopped et fireEditingCanceled doivent se situer respectivement dans stopCellEditing() et cancelCellEditing(). Je ne connais pas les méthodes editingStopped et editingCanceled...
    Par contre tu n'as pas à les appeller car elles sont appellé automatiquement par le gestionnaire d'évenement de la JTable.


    Concrètement comment ca se pase :

    Lorsque tu cliques sur une cellule pour l'éditer :
    • 1) La JTable appelle la méthode getTableCellEditorComponent() pour afficher le composant.
      2) La JTable s'ajoute en tant que Listener sur ton editeur.


    Pendant ce temps tu peux modifier la valeur de la cellule.

    Maintenant lorsque tu quittes l'éditeur de la cellule, la méthode stopCellEditing() est automatiquement appellé, et comme elle appelle fireEditingStopped() la JTable sait que l'édition est termimé puisqu'elle s'est ajouter en Listener.

    Donc la JTable récupère la nouvelle valeur (avec getCellEditorValue()) et la passe à son modèle (avec setValueAt())...

    Donc tu n'a pas de méthode à appeller directement (sauf en cas de traitement spécial mais ce n'est pas ton cas).
    Il faut juste que ton editeur soit enregistrer auprès de la colonne...

    Pour info j'ai testé la classe que je t'ai donné avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Object[][] info = {
        			{"","",""},
        			{"","",""},
        			{"","",""},
        			{"","",""}
        	};
            JTable table = new JTable(info, new String[]{"NomDelegation","NomLogement","Sexe"});
            ComboEditor editor = new ComboEditor(null);
            table.getColumnModel().getColumn(0).setCellEditor(editor);
            table.getColumnModel().getColumn(1).setCellEditor(editor);
            table.getColumnModel().getColumn(2).setCellEditor(editor);
     
            // + ajout dans la frame et affichage
    Maintenant je te conseille vivement de lire le tutoriel de Sun sur les JTable : How to Use Table

    a++

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Merci beaucoup!!
    Pour le tutorial c déjà fait!!
    C'est vrai que j'ai compris certains trucs mas pas tout!!
    J'ssayerai de fouiller un peu plus!!
    Voilà au prochain post et merci encore

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Excuse moi à nouveau adiGuba

    Le problème est que:

    Je m'explique, ma classe principale est de type JFrame, qui contient une JTable.
    J'ai lié à cette JTable des renderers et des editors
    Selon différents menus ma JTable prend des colonnes différentes, et pour moi c'est difficile de figer comme celà (hum mais vu mon niveau c pt-ê normal )

    table.getColumnModel().getColumn(0).setCellEditor(editor);
    table.getColumnModel().getColumn(1).setCellEditor(editor);
    table.getColumnModel().getColumn(2).setCellEditor(editor);
    car je veux que ma JTable soit générique. Faut-il que ma JTable implemente une interface ou pas?
    Les méthodes editingCanceled et editingStopped viennent de l'interface CellEditorListener qui implémente ma classe principale.
    Donc si j'ai b1 compris ma classe principale n'a pas besoin d'implémenter
    d'interface alors!! Seuls mes editors s'en occupent!!
    J'ai juste à lier ma Jtable à mes editors comme tel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    jTablePrincipale.setDefaultEditor(JComboBox.class, comboEditor);
    jTablePrincipale.setDefaultEditor(String.class, new CellEditor());
    jTablePrincipale.setDefaultEditor(Date.class, new DateEditor());
    Ai-je bien compris?

    Je me contente donc d'étendre et d'implementer dans mes editors, c tout!!
    Je vais de ce pas tester tout ça dans l'attente d'une confirmation

    PS: Si j'abuse, n'hésites surtout pas à me le dire

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 9
    Par défaut
    Merci beaucoup!!
    Grâce à toi j'ai pu trouver!!

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

Discussions similaires

  1. [debutant]Gérer plusieurs Stringarrays
    Par titpuce dans le forum Langage
    Réponses: 6
    Dernier message: 22/02/2007, 14h55
  2. [debutant]editer une JTable
    Par dxavier dans le forum Composants
    Réponses: 7
    Dernier message: 20/07/2006, 10h49
  3. [debutant]gérer plusieurs variables dans un for ?
    Par Merfolk dans le forum Débuter
    Réponses: 5
    Dernier message: 09/03/2006, 21h01
  4. [debutant] Gérer escape sur un JDialog
    Par debutant java dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 01/09/2004, 17h45
  5. [debutant]Jpane et Jtable
    Par noOneIsInnocent dans le forum Débuter
    Réponses: 4
    Dernier message: 22/03/2004, 10h45

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