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] editors --> text field and combo box


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 137
    Par défaut [JTABLE] editors --> text field and combo box
    Bonjour à tous,

    ça fait deux jours que je suis bloqué sur cette p...... de JTable.
    Je vous explique je suis en train de faire une applet qui contient entre autres une JTable. Au lancement de l'applet toute la table est non editable.
    Un bouton permet de rendre certaines cellules editables. Ces cellules appartiennent à la même colonne.
    J'ai définit mon propre editeur

    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
     
    public class ComboTableCellEditor extends DefaultCellEditor {
     
     
      public ComboTableCellEditor() {
        super(new JTextField());
        setClickCountToStart(1);
     
      }
     
      /** {@inheritDoc}
       */
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        Component editor = super.getTableCellEditorComponent(table, value, isSelected, row, column);
        DefaultCellEditor comboEditor =null;
     
     
        if(row==10)
        {
        	JComboBox combobox = new JComboBox();
        	comboEditor = new DefaultCellEditor(combobox);   
        	table.setDefaultEditor(Vector.class,comboEditor);    	    	
        	combobox.addItem("Valeur 1");
        	combobox.addItem("Valeur 2");
        	combobox.addItem("Valeur 3");    
        	editor = comboEditor.getTableCellEditorComponent(table, value, isSelected, row, column);
        }
        else
        {
        	table.setDefaultEditor(Vector.class,this);
        	return super.getTableCellEditorComponent(table, value, isSelected, row, column);
        }
        return editor;
      }
    }
    En fait j'essaie de faire un editeur qui edite en type 'textfield' partout sauf a la ligne 10 ou j'essaie de mettre en place un editeur de type 'combobox'


    ça ne marche pas !!


    Qu'en pensez vous ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 20
    Par défaut
    Essaye plutôt d'hériter de AbstractCellEditor et d'implémenter TableCellEditor. Tu auras un unique Editor pour ta jtable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maTable.getColumnModel().getColumn(maColonne).setCellEditor(new ValueCellEditor());


    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
     
     
    import java.awt.Component;
    import java.awt.event.MouseEvent;
    import java.util.EventObject;
     
    import javax.swing.AbstractCellEditor;
    import javax.swing.JComboBox;
    import javax.swing.JComponent;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.table.TableCellEditor;
     
     
    	public class ComboTableCellEditor extends AbstractCellEditor implements TableCellEditor {
     
     
    		/**
                     * Composant retourné par la fonction getTableCellEditorComponent(..)
                     */
    		private JComponent component;
     
     
    		/**
                     * Nombre de clique à effectuer à la souris pour déclencher l'édition, et donc l'utilisation
                     * du composant <code>component</code>.
                     */
    		private int clickCountToStart = 1;
     
     
     
    		  public ComboTableCellEditor() {
    		   // Vide	   
    		  }
     
    		  /** {@inheritDoc}
                       */
    		public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
     
     
     
    		    if(row==10)
    		    {
    		       this.component = new JComboBox();
     
    		       ((JComboBox) this.component).addItem("Valeur 1");
    		       ((JComboBox) this.component).addItem("Valeur 2");
    		       ((JComboBox) this.component).addItem("Valeur 3");   
     
    		       return this.component;
    		    }
    		    else
    		    {
     
    		    	this.component =  new JTextField();
    		    	return this.component;
    		    }
     
    		  }
     
     
     
    		public Object getCellEditorValue() {
    			return this.component;
    		}
     
     
    		/**
                     * Pour gérer le nb de clique nécessaire à l'edition
                     */
    		public boolean isCellEditable(EventObject anEvent) {
    			if (anEvent instanceof MouseEvent) { 
    				return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
    			}
    			return true;
    		}
     
     
    		/**
                     * Retourne le nombre de clique nécessaire à l'édition de la cellule.
                     * 
                     * @return Retourne le nombre de clique nécessaire à l'édition de la cellule
                     */ 
    		public int getClickCountToStart() {
    			return clickCountToStart;
    		}
     
     
    		/**
                     * Affecte le nombre de clique nécessaire à l'édition de la cellule.
                     *  
                     * @param clickCountToStart nombre de clique
                     */
    		public void setClickCountToStart(int clickCountToStart) {
    			this.clickCountToStart = clickCountToStart;
    		}
     
     
     
    }


    J'ai pas testé...mais c'est l'idée... Comme tu retournes un objet Component (et qu'il peut être en réalité soit un JTextField, soit un JComboBox) il te faudra le caster dans ton modèle de table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void setValueAt(Object aValue, int row, int column) {
    		if(column == 2) 			
    			if(aValue instanceof JComboBox) 
    				{ /* Traiter */ }
    			else if (aValue instanceof JTextField)
    				{ /* Traiter */		else 
    				return;
    	}
    Encore une fois j'ai pas testé, donc il y a surement quelques bugs..En revanche le principe de la solution fonctionne...

  3. #3
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 137
    Par défaut
    Je vais essayer..

    Donc je pourrais implementer un editeur par cellule ?

    Merci je te tiens au courant !!

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 137
    Par défaut
    Il me fait une erreur dans le constructeur ..

    Il ne veut pas de constructeur vide ...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 20
    Par défaut
    Es tu certain que ta classe hérite de AbstractCellEditor ?

    Montre moi ton code si tu ne trouves toujours pas le pb. ça sera plus simple pour t'aider!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    public AbstractCellEditor()
    C'est la définition (cf. java doc) du constructeur de cette classe.

    Sinon,
    Avec cette méthode, tu utiliseras le même éditeur pour toutes les cellules. en revanche, selon les coordonnées (entres autres) de la cellule, tu pourras retourner le composant qu tu souhaites: donc un ComboBox ou un textfield dans ton cas. C'est dans le modèle de ta table (dans la méthode setvalue(..)) que tu casteras comme il faut le composant.

  6. #6
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 137
    Par défaut
    OK d'accord cell editor..

    voilà ce que je fais dans le setvalue..

    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
     
     
     
        System.out.println("Setting value at " + row + "," + col + " to " + value + " (an instance of "+ value.getClass() + ")");
        //printDebugData();
     
        if(col == 1)
        {
        	if(value instanceof JComboBox)
        	{
        		JComboBox combo = (JComboBox)value;
        		data[row][col] = combo.getSelectedItem();
        		fireTableCellUpdated(row, col);
        	}
        	else if (value instanceof JTextField)
        	{
        		data[row][col] = value;
        	    fireTableCellUpdated(row, col);
        	} 
        	else
        	{
        		data[row][col] = value;
        	    fireTableCellUpdated(row, col);
        	}    	
        }
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    Cela marche bien..

    Mais le problème survient lorsque j'essaie de remettre ces cellules non editables.. Cela viendrait il des methodes que l'on récupére de l'AbstractCellEditor

    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
     
    public class ComboTableCellEditor extends AbstractCellEditor  implements TableCellEditor {
     
     
        /**
         * Composant retourné par la fonction getTableCellEditorComponent(..)
         */
        private JComponent component;
     
     
        /**
         * Nombre de clique à effectuer à la souris pour déclencher l'édition, et donc l'utilisation
         * du composant <code>component</code>.
         */
        private int clickCountToStart = 1;
     
     
     
          public ComboTableCellEditor() {
     
         // Vide      
          }
     
          /** {@inheritDoc}
           */
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
     
     
     
            if(row==10)
            {
               this.component = new JComboBox();
     
               ((JComboBox) this.component).addItem("WIP");
               ((JComboBox) this.component).addItem("HELD");
               ((JComboBox) this.component).addItem("RELEASED");   
     
               return this.component;
            }
            else
            {
     
               this.component =  new JTextField();
               return this.component;
            }
     
          }
     
     
     
        public Object getCellEditorValue() {
           return this.component;
        }
     
     
        /**
         * Pour gérer le nb de clique nécessaire à l'edition
         */
        public boolean isCellEditable(EventObject anEvent) {
           if (anEvent instanceof MouseEvent) {
              return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
           }
           return true;
        }
     
     
        /**
         * Retourne le nombre de clique nécessaire à l'édition de la cellule.
         *
         * @return Retourne le nombre de clique nécessaire à l'édition de la cellule
         */
        public int getClickCountToStart() {
           return clickCountToStart;
        }
     
     
        /**
         * Affecte le nombre de clique nécessaire à l'édition de la cellule.
         * 
         * @param clickCountToStart nombre de clique
         */
        public void setClickCountToStart(int clickCountToStart) {
           this.clickCountToStart = clickCountToStart;
        }
     
    	public void cancelCellEditing() {
    		fireEditingCanceled();	
     
    	}
     
    	public boolean stopCellEditing() 
    	{
    		fireEditingStopped(); 
    		return false;
    	}
     
    	public boolean shouldSelectCell(EventObject anEvent) {
     
    		return true;
    	}
     
    	public void addCellEditorListener(CellEditorListener l) {
    	//	super.addCellEditorListener();
     
    	}
     
    	public void removeCellEditorListener(CellEditorListener l) {
     
     
    	}

    en fait les cellules restent toujours editables ..

    Any Idea ? et je pourrais mettre le famuex résolu gràce à toi !!!!

  7. #7
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 137
    Par défaut
    fe comprends pas mais le système ne passe pas par le setValueAt() de mon Model...

    comment lui dire de passer ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 20
    Par défaut
    Dans la fonction isCellEditable de ton editor, il faut que tu retourne false systématiquement sauf si le nb de clique est correct. De plus il faut que tu rajoute une contrainte booléenne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    boolean maContrainte;
     
    public boolean isCellEditable(EventObject anEvent) {
           if (anEvent instanceof MouseEvent) {
     
              return maContrainte &&  ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
           }
           return false;
        }

    Enfin à tester...Je pense que l'idée est là

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 20
    Par défaut
    Citation Envoyé par PoPeio
    fe comprends pas mais le système ne passe pas par le setValueAt() de mon Model...

    comment lui dire de passer ?
    Montre moi ton modèle...

  10. #10
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 137
    Par défaut
    voilà mon modèle

    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
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
     
    public class AttributeValueModel extends DefaultTableModel 
    {
    	private String[] columnNames = {""};
        private ArrayList listCellNotEditable;
     
        private Object[][] data = {{""}};
     
     
     
    	public AttributeValueModel () 
    	{ 
    		super ();
    		this.listCellNotEditable = new ArrayList ();		
    	}
     
    	public AttributeValueModel (int numRows, int numColumns) 
    	{   super (numRows, numColumns);
    		this.listCellNotEditable = new ArrayList ();
    	}
     
    	public AttributeValueModel (Vector columnNames, int numRows) 
    	{   super (columnNames, numRows);
    		this.listCellNotEditable = new ArrayList ();
    	}
     
    	public AttributeValueModel (Object[] columnNames, int numRows) 
    	{   super (columnNames, numRows);
    		this.listCellNotEditable = new ArrayList ();
    	}
     
    	public AttributeValueModel (Vector data, Vector columnNames) 
    	{   super (data, columnNames);
    		this.listCellNotEditable = new ArrayList ();
    	}
     
    	public AttributeValueModel (Object[][] data, Object[] columnNames) 
    	{   super (data, columnNames);
    		this.listCellNotEditable = new ArrayList ();
    	}
     
        public void setColumnNames(String[] columnN)
        {
        	System.out.println(" les colonnes changent :"+columnN);
        columnNames=columnN;	
     
        }
        public void setData(Object[][] dataTable)
        {
        	System.out.println(" les données changent :"+dataTable);
        	data=dataTable;	
        	super.setDataVector(data, columnNames);
     
     
        }
     
        public String getColumnName(int col) {
          return columnNames[col];
        }
     
        public Object getValueAt(int row, int col) {
          return data[row][col];
        }
     
        public void clearArrayCellSelectable() 
        {
            this.listCellNotEditable.clear();
          }
     
     
        /*
         * JTable uses this method to determine the default renderer/ editor for
         * each cell. If we didn't implement this method, then the last column
         * would contain text ("true"/"false"), rather than a check box.
         */
        public Class getColumnClass(int c) 
        {
        	return Object.class;
        }
     
        /*
         * Don't need to implement this method unless your table's editable.
         */
     
     
     
        public boolean isCellEditable(int row, int col) 
        {   
        	int index = this.listCellNotEditable.indexOf (new Point (row, col));
    	if ( index == -1 )
    	{	return ( false );
    	}
    	else
    	{	return ( true );
    	}
    }
     
        public void addCellEditable (int row, int column)
    	{	if ( ! (column >= 0 && column < this.getColumnCount ()) )
    		{	return;
    		}
    		if ( ! ((row >= 0) && (row < this.getRowCount ())) )
    		{	return;
    		}
    		this.listCellNotEditable.add (new Point (row, column));
    	}
     
    	public void removeNotEditableCell (int row, int column)
    	{	int index = this.listCellNotEditable.indexOf (new Point (row, column));
    		if ( index != -1 )
    		{	this.listCellNotEditable.remove (index);
    		}
    	}
     
     
        /*
         * Don't need to implement this method unless your table's data can
         * change.
         */
        public void setValueAt(Object value, int row, int col) {
     
        System.out.println("Setting value at " + row + "," + col + " to " + value + " (an instance of "+ value.getClass() + ")");
        //printDebugData();
     
        if(col == 1)
        {
        	if(value instanceof JComboBox)
        	{
        		System.out.println("on rentre dans le combobox");
        		JComboBox combo = (JComboBox)value;
        		data[row][col] = combo.getSelectedItem();
        		fireTableCellUpdated(row, col);
        		removeNotEditableCell (row, col);    		
        	}
        	else if (value instanceof JTextField)
        	{
        		data[row][col] = value;
        	    fireTableCellUpdated(row, col);
        	} 
        	else
        	{
        		data[row][col] = value;
        	    fireTableCellUpdated(row, col);
        	}    
        }
        else
        {
        	data[row][col] = value;
        	fireTableCellUpdated(row, col);
        }
     
        }

  11. #11
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 137
    Par défaut
    donc voici mon modèle (au dessus)


    pour le iscellEditable il passe à false lorsque je clique sur un bouton (je vide la liste et toute les cellules passe non étitable) mais plus maintenant depuis que j'ai min cellEditor ..

    Je desespére

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 20
    Par défaut
    J'ai plus bcp de temps devant moi là...mais je pense que c'est une simple histoire de conditions sur tes isCellEditor (celui du modèle et celui de l'editor)...Je sais pas trop...

    Bon courage...

  13. #13
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 137
    Par défaut
    YES !!!!!!!!!!!!!!!!!!!


    J'ai réussi ......


    MERCI A TOI alex.nd ..

    en fait le soucis provenait des methodes que j'ai récupéré de l'AbstractCellEditor .. IL FAUT DONC RAPPELER LES METHODES MERES (super) Et TOUT ROULE ..

    Merci encore

    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
     
     public boolean stopCellEditing()
       {
          fireEditingStopped();
          return false;
       }
     
       public boolean shouldSelectCell(EventObject anEvent) {
     
          return true;
       }
     
       public void addCellEditorListener(CellEditorListener l) {
       //   super.addCellEditorListener();
     
       }
     
       public void removeCellEditorListener(CellEditorListener l) {
     
     
       }

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

Discussions similaires

  1. Empêcher de supprimer le texte d'une combo-box
    Par jacko842 dans le forum VB.NET
    Réponses: 4
    Dernier message: 14/04/2010, 21h15
  2. [vb.net] recuperer une valeur dans un text combo box
    Par stolx_10 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 08/02/2007, 16h11
  3. Réponses: 1
    Dernier message: 16/12/2006, 16h45
  4. Combo Box & JTable
    Par bobic dans le forum Composants
    Réponses: 1
    Dernier message: 13/08/2006, 11h03
  5. [JTable][JComboBox] rendre un combo box dans un Jtable
    Par bigbabou dans le forum Composants
    Réponses: 23
    Dernier message: 19/02/2006, 06h55

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