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 :

Edition JTextField dans ma JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 13
    Par défaut Edition JTextField dans ma JTable
    Bonjour,

    Je suis actuellement en stage et je dois créer une interface graphique pour les personnes devant aller sur le terrain saisir des données.

    Un de mes écrans est sous forme de table dans laquelle se trouve 3 JComboBox et 1 JTextField.

    Lors de l'ajout tout se passe bien, j'ai mes Combo qui s'affiche ainsi que mon champ de texte.

    Seulement lorsque je veux écrire qqch à l'intérieur de mon JTextField, impossible de voir le curseur clignoter...
    Lorsque je tape une lettre ou autres choses dans mon JTextField, celle-ci s'affiche mais il y a déjà une longue phrase écrite à l'intérieur qui s'affiche en même temps ...
    Je ne comprend pas pourquoi et je n'arrive pas à faire en sorte qu'elle ne s'affiche pas.

    Je vous joint quelques bout de mon code.
    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
     
    public class TableComponent extends DefaultTableCellRenderer {
     
    	public Component getTableCellRendererComponent(JTable table,
    		Object value, boolean isSelected, boolean hasFocus, int row,
    		int column) {
    			if (value instanceof JTextField){
    				((JTextField) value).setText(" ");
    				return (JTextField) value;
    			}
    			else if(value instanceof JComboBox){
    				return (JComboBox) value;
    			}
    			else
    				return this;
    	}
    Voici ma class d'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
    37
    38
    39
    40
    41
    42
    43
    44
     
    //Déclaration des champs du panel éspèce
    	JComboBox espece_nom_latin = new JComboBox(Constantes.CONST_NOM_LATIN_ESPECE);
    	JComboBox espece_strates = new JComboBox(Constantes.CONST_STRATES);
    	JComboBox espece_coef_abondance = new JComboBox(Constantes.CONST_COEFFICIENT_ABONDANCE);
    	JTextField espece_nom_saisie = new JTextField();
     
     
    	//Déclaration du tableau d'objet pour remplir la table
    	private Object [][] espece_tab;
     
    	public FloreEspece(){
     
    		//Création du tableau d'objet
    		this.espece_tab = new Object[][]{{this.espece_nom_latin,this.espece_nom_saisie,this.espece_strates,this.espece_coef_abondance,}};
     
    		//Création du panel espece
    		this.setPreferredSize(new Dimension (1150,590));
     
    		//Création de la table
    		this.table = new JTable();
    		this.table.setGridColor(Color.BLACK);
    		this.table.setPreferredScrollableViewportSize(this.getPreferredSize());
    		this.table.setModel(new TableModele (this.espece_tab,Constantes.CONST_TABLE_MODELE));
    		this.table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    		this.table.setRowHeight(22);
    		this.table.setDefaultRenderer(JComponent.class, new TableComponent());
    		this.table.getColumn("Choix").setCellEditor(new DefaultCellEditor(this.espece_nom_latin));
    		this.table.getColumn("Nom de l'éspèce").setCellEditor(new DefaultCellEditor(this.espece_nom_saisie));
    		this.table.getColumn("Strate").setCellEditor(new DefaultCellEditor(this.espece_strates));
    		this.table.getColumn("Abondance/Dominance").setCellEditor(new DefaultCellEditor(this.espece_coef_abondance));	
    		this.scrollpane = new JScrollPane(table);
     
    		//Ajout du scrollpane(la table) au panel espece
    		this.add(this.scrollpane);
     
     
    	}
     
    	public Class getColumnClass(int col){
    		return this.espece_tab[0][col].getClass();
    	}
     
    }
    Merci

  2. #2
    Membre très actif
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Par défaut
    Bonjour il faut que tu utilises les balises code (#) pour tes messages.

    Dans le tableModel on précise régulièrement quelles sont les cellules éditables.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 13
    Par défaut
    Oui la méthode pour éditer mes cellules a été 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
    public class TableModele extends AbstractTableModel{
     
    	private final Object[][] donnees;
        private final String[] entetes;
     
        /**
         * Constructeur de TableModele
         * @param modO
         * @param modS
         */
        public TableModele(Object[][] modO, String[] modS) {
            super();
            this.donnees = modO;
            this.entetes = modS;
        }
     
     
        /**
         * @return int
         */
        public int getRowCount() {
            return donnees.length;
        }
     
        /**
         * @return int
         */
        public int getColumnCount() {
            return entetes.length;
        }
     
     
        /**
         * @param columIndex
         * @return String
         */
        public String getColumnName(int columnIndex) {
            return entetes[columnIndex];
        }
     
        /**
         * @param rowIndex
         * @param columIndex
         * @return Object
         */
        public Object getValueAt(int rowIndex, int columnIndex) {
            return donnees[rowIndex][columnIndex];
        }
     
         /**
          * @param row
          * @param col
          * @return boolean
          */
    	public boolean isCellEditable(int row, int col) {
    	    return true;
    	}
     
    	public Class getColumnClass(int col){
    		//On retourne le type de la cellule à la colonne demandée
    		//On se moque de la ligne puisque les données sur chaque ligne sont les mêmes
    		//On choisit donc la première ligne
    		return this.donnees[0][col].getClass();
    	}
     
    }
    D'ailleurs mes JComboBox marche bien, seul les JTextFields me posent problèmes.

  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
    Ta façon de procéder n'est pas la bonne dans le cas présent.

    Il ne faut pas mettre les composants dans le modèle de la JTable, juste les données qui sont censées être affichées. Ce système a été mis en place au niveau de la JTable pour des raisons de performance et d'occupation de la mémoire, les Composants étant relativement gourmands comme objets.

    Puis il faut un Renderer qui contient une seule instance du/des composant/s à afficher.

    Enfin les DefaultTableRenderer et DefaultTableEditor mettent déjà à disposition un moyen simple d'avoir des textfields et combobox sans avoir à se fouler.

    Pour les JTextField, il suffit de laisser le couple renderer/editor fourni par la JTable, dès lors que le modèle renvoie String.class pour la colonne. Pour les Comboxes, il suffit de procéder de la façon suivante, même pas besoin de passer par un editor particulier:

    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
     
    package table;
     
    import java.awt.Component;
     
    import javax.swing.DefaultCellEditor;
    import javax.swing.JComboBox;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.table.DefaultTableCellRenderer;
     
    public class TableComponent extends DefaultTableCellRenderer {
     
        private JTextField tf;
        private JComboBox combo;
     
        public TableComponent() {
            tf = new JTextField();
            combo = new JComboBox();
            //Reste de l'initialisation de la comboBox;
        }
     
        public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
                if ( column == 0 ){
                    tf.setText(value.toString());
                    return (JTextField) value;
                }
                else if(value instanceof JComboBox){
                    return (JComboBox) value;
                }
                else
                return this;
        }
     
        public static void main(String[] args) {
            JTable t = new JTable();
     
            JComboBox myCombo = new JComboBox();
            myCombo.addItem("A");
            myCombo.addItem("B");
            myCombo.addItem("C");
            myCombo.addItem("D");
            t.getColumnModel().getColumn(0).setCellRenderer(new TableComponent());
            t.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(myCombo));
        }
    }

    De plus je ne suis pas vraiment fan des ComboBoxes en tant qu'editor, ça a tendance à diminuer fortement la lisibilité de la JTable, ce qui n'est pas vraiment souhaité.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 13
    Par défaut
    Alors voila j'ai refait mon code, mais rien n'a changé.

    Je vous met en pièce jointe 2 screen écran de ce qu'il se passe ...

    Le premier est l'affichage normal, le second est l'affichage lorsque je veux taper du texte dans mon JTextField.

    La phrase complète marquée dans le JTextField est :

    javax.swing.JTextField[,-143,-21,0x0,invalid,layout=javax.swing.plaf.basic.BasicTextUI$UpdateHandler,alignmentX=0.0
    ,alignmentY=0.0,border=com.apple.laf.AquaTextFieldBorder@191a01dd,flags=288,maximumSize=,
    minimumSize=,preferredSize=,caretColor=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0],
    disabledTextColor=javax.swing.plaf.ColorUIResource[r=128,g=128,b=128],editable=true,
    margin=javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],selectedTextColor=com.apple.laf.AquaImageFactory$SystemColorProxy[r=0,g=0,b=0],
    selectionColor=com.apple.laf.AquaImageFactory$SystemColorProxy[r=191,g=251,b=118],columns=0,columnWidth=0,command=,horizontalAlignment=LEADING]
    Images attachées Images attachées   

  6. #6
    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
    Il ne faut mettre dans les données de la Jtable que la String à afficher dans le TextField, pas le textfield en lui même.

    Le truc à comprendre est qu'il ne faut pas mettre de composants dans la JTable. Il faut uniquement mettre des données, la Jtable n'étant pas prévue pour afficher des composants de cette façon là.

    Je te conseille la lecture du tuto suivant pour bien comprendre les mécanismes de la JTable: http://baptiste-wicht.developpez.com.../swing/jtable/

Discussions similaires

  1. Ajouter contenu JTextField dans JTable
    Par laurent2403 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/09/2012, 10h48
  2. [Swing] Composant JTextField dans une JTable
    Par stc074 dans le forum Composants
    Réponses: 1
    Dernier message: 16/03/2011, 15h18
  3. editer un JTextField contenu dans une JTable
    Par thierry_b dans le forum Composants
    Réponses: 8
    Dernier message: 16/07/2009, 17h52
  4. recuperer contenu JTextField dans un JTable
    Par ryma88 dans le forum NetBeans
    Réponses: 2
    Dernier message: 26/06/2009, 13h44
  5. PB du caret sur un JTextField dans une Jtable
    Par jeffciara dans le forum Composants
    Réponses: 4
    Dernier message: 14/11/2006, 18h48

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