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] Editeur


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut [Résolu][JTable] Editeur
    Bonjour,

    J'ai un problème pendant l'edition d'une JTable

    J'ai créé une classe étendant JTextArea et implémentant TableCellRenderer et TableCellEditor.

    Tout fonctionne bien sauf un petit détail.

    Lorsque j'édite une cellule, si je déplace la souris sur une autre cellule, la cellule édité prend le contenu de cette cellule. C'est pratique dans certaine condition, mais ca devient vite galère dans d'autres.

    Je n'arrive pas à trouver quelle action provoque cette modification.

    Si quelqu'un pouvait m'aider.

    D'avance merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 65
    Par défaut
    Avec un bout de code, quelqu'un pourra t'aider plus facilement.

    Mais ce que tu fais semble étrange.
    Perso, je ferai 2 classes : une pour le renderer et une pour l'editor, le renderer héritant de JTextArea et l'editor agrégeant un JTextArea.
    Bases toi sur ce 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        JTable table = new JTable();
     
        // Add some data...
     
        // Install the custom editor on the first column
        int vColIndex = 0;
        TableColumn col = table.getColumnModel().getColumn(vColIndex);
        col.setCellEditor(new MyTableCellEditor());
     
        public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor {
            // This is the component that will handle the editing of the cell value
            JComponent component = new JTextField();
     
            // This method is called when a cell value is edited by the user.
            public Component getTableCellEditorComponent(JTable table, Object value,
                    boolean isSelected, int rowIndex, int vColIndex) {
                // 'value' is value contained in the cell located at (rowIndex, vColIndex)
     
                if (isSelected) {
                    // cell (and perhaps other cells) are selected
                }
     
                // Configure the component with the specified value
                ((JTextField)component).setText((String)value);
     
                // Return the configured component
                return component;
            }
     
            // This method is called when editing is completed.
            // It must return the new value to be stored in the cell.
            public Object getCellEditorValue() {
                return ((JTextField)component).getText();
            }
        }
    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
        JTable table = new JTable();
        // Add data...
     
        // Install the custom renderer on the first visible column
        int vColIndex = 0;
        TableColumn col = table.getColumnModel().getColumn(vColIndex);
        col.setCellRenderer(new MyTableCellRenderer());
     
        // This renderer extends a component. It is used each time a
        // cell must be displayed.
        public class MyTableCellRenderer extends JLabel implements TableCellRenderer {
            // This method is called each time a cell in a column
            // using this renderer needs to be rendered.
            public Component getTableCellRendererComponent(JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {
                // 'value' is value contained in the cell located at
                // (rowIndex, vColIndex)
     
                if (isSelected) {
                    // cell (and perhaps other cells) are selected
                }
     
                if (hasFocus) {
                    // this cell is the anchor and the table has the focus
                }
     
                // Configure the component with the specified value
                setText(value.toString());
     
                // Set tool tip if desired
                setToolTipText((String)value);
     
                // Since the renderer is a component, return itself
                return this;
            }
     
            // The following methods override the defaults for performance reasons
            public void validate() {}
            public void revalidate() {}
            protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
            public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
        }
    J'espère que ça t'aidera. Bon courage et surtout, bon amusement !

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Voici le code.

    Par contre pour la classe je pense que c'est mieux d'en avoir qu'une surtout qu'elles ont des méthodes partagées.


    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
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
     
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.FontMetrics;
    import java.awt.event.MouseEvent;
    import java.sql.Date;
    import java.util.Enumeration;
    import java.util.EventObject;
    import java.util.Vector;
     
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    import javax.swing.event.CellEditorListener;
    import javax.swing.event.ChangeEvent;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableColumn;
     
    public class MyTextAreaCell extends JTextArea implements TableCellRenderer,
    		TableCellEditor {
     
    	public MyTextAreaCell() {
    		super();
    	}
     
    	public void setColumnSize(JTable table) {
    		FontMetrics fm = table.getFontMetrics(table.getFont());
    		for (int i = 0; i < table.getColumnCount(); i++) {
    			int max = 0;
    			for (int j = 0; j < table.getRowCount(); j++) {
    				int taille = fm.stringWidth(table.getValueAt(j, i).toString());
    				if (taille > max)
    					max = taille;
    			}
    			String nom = (String) table.getColumnModel().getColumn(i)
    					.getIdentifier();
    			int taille = fm.stringWidth(nom) + 30;
    			if (taille > max)
    				max = taille;
    			table.getColumnModel().getColumn(i).setPreferredWidth(max + 50);
    		}
    	} 
     
    	public Component getTableCellRendererComponent(JTable table, Object value,
    			boolean isSelected, boolean hasFocus, int row, int column) {
    		if (isSelected) {
    			setBackground(Color.BLUE);
    			setForeground(Color.WHITE);
    		} else {
    			if ((row % 2) == 0) {
    				setBackground(Color.YELLOW);
    				setForeground(Color.BLACK);
    			} else {
    				setBackground(Color.WHITE);
    				setForeground(Color.BLACK);
    			}
    		}
    		setAutoscrolls(false);
    		setLineWrap(true);
    		setWrapStyleWord(true);
    		setText((value.toString()));
    		if (value.getClass().equals(d.getClass())) {
    			setText(dc.getDateFR(value.toString()));
    		} else {
    			setText(value.toString());
    		}
    		int height = getHeight(this, table, value.toString(), row, column);
    		if (height != 0) {
    			table.setRowHeight(row, height);
    		}
    		return this;
    	}
     
    	public Component getTableCellEditorComponent(JTable table, Object value,
    			boolean isSelected, int row, int column) {
    		if ((row % 2) == 0) {
    			setBackground(Color.YELLOW);
    			setForeground(Color.BLACK);
    		} else {
    			setBackground(Color.WHITE);
    			setForeground(Color.BLACK);
    		}
    		savedValue = value;
    		setAutoscrolls(true);
    		setLineWrap(true);
    		setWrapStyleWord(true);
    		if (value.getClass().equals(d.getClass())) {
    			setText(dc.getDateFR(value.toString()));
    		} else {
    			setText(value.toString());
    		}
    		return this;
    	}
     
    	private int getHeight(JTextArea textArea, JTable table, String text,
    			int row, int column) {
    		FontMetrics fm = getFontMetrics(textArea.getFont());
    		int numberOfTextRows = 2;
    		int numberOfTextRows_IncludingNewlines = 0;
    		int textWidth = 0;
    		int columnWidth = 0;
    		if (fm != null) {
    			textWidth = fm.stringWidth(text);
    		}
    		if (textWidth > 0) {
    			TableColumn tableColumn = table.getColumnModel().getColumn(column);
    			columnWidth = tableColumn.getWidth()
    					- (textArea.getMargin().left + textArea.getMargin().right);
    			numberOfTextRows = (textWidth / columnWidth + 1);
    			if (text.indexOf('\n') > -1) {
    				for (int index = 0; index < text.length();) {
    					try {
    						int index_1 = text.indexOf('\n', index);
    						int index_2 = text.indexOf('\n', index + 1);
    						String line = text.substring(index_1, index_2);
    						textWidth = fm.stringWidth(line);
    						numberOfTextRows_IncludingNewlines += ((textWidth / columnWidth) + 1);
    						index = index_2;
    					} catch (StringIndexOutOfBoundsException ex) {
    						break;
    					}
    				}
    				numberOfTextRows = Math.max(numberOfTextRows,
    						numberOfTextRows_IncludingNewlines) + 2;
    			}
    		}
    		int rowHeight = fm.getHeight() * (numberOfTextRows);
    		if (rowHeight > table.getRowHeight(row)) {
    			return rowHeight;
    		}
    		return 0;
    	}
     
    	public boolean isCellEditable(EventObject anEvent) {
    		if (anEvent instanceof MouseEvent) {
    			MouseEvent evt = (MouseEvent) anEvent;
    			if (evt.getClickCount() == 2) {
    				return true;
    			}
    		}
    		return false;
    	}
     
    	public boolean shouldSelectCell(EventObject anEvent) {
    		return true;
    	}
     
    	public void addCellEditorListener(CellEditorListener l) {
    		listeners.addElement(l);
    	}
     
    	public void removeCellEditorListener(CellEditorListener l) {
    		listeners.removeElement(l);
    	}
     
    	public void cancelCellEditing() {
    		setText(savedValue.toString()); // revert to last saved value
    		ChangeEvent ce = new ChangeEvent(this);
    		Vector copy = (Vector) listeners.clone();
    		Enumeration e = copy.elements();
    		while (e.hasMoreElements()) {
    			CellEditorListener l = (CellEditorListener) e.nextElement();
    			l.editingCanceled(ce);
    		}
    	}
     
    	public boolean stopCellEditing() {
    		ChangeEvent ce = new ChangeEvent(this);
    		Vector copy = (Vector) listeners.clone();
    		Enumeration e = copy.elements();
    		while (e.hasMoreElements()) {
    			CellEditorListener l = (CellEditorListener) e.nextElement();
    			l.editingStopped(ce);
    		}
    		return true;
    	}
     
    	public Object getCellEditorValue() {
    		return new String(getText());
    	}
     
    	Date_convert dc = new Date_convert();
     
    	Date d = new Date(0);
     
    	private transient Vector listeners = new Vector();
     
    	private Object savedValue;
     
    }
    le model de 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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    import java.sql.Date;
    import java.util.Vector;
     
    import javax.swing.table.AbstractTableModel;
     
    import sun.awt.RepaintArea;
     
    public class MyInterventionModel extends AbstractTableModel {
     
    	public MyInterventionModel(Vector data, String[] columName) {
    		this.columnNames = columName;
    		this.data = convert(data);
    	}
     
    	public Object[][] convert(Vector data) {
    		Object[][] o = null;
    		Vector v;
    		try {
    			int row = data.size();
    			int column = ((Vector) data.get(0)).size();
    			o = new Object[row][column];
     
    			for (int i = 0; i < row; i++) {
    				v = (Vector) data.get(i);
    				for (int j = 0; j < column; j++) {
    					o[i][j] = v.get(j);
    				}
    			}
    		} catch (Exception e) {
    			System.out.println(e);
    			return new Object[0][columnNames.length];
    		}
    		return o;
    	}
     
    	public int getRowCount() {
    		return data.length;
    	}
     
    	public int getColumnCount() {
    		return columnNames.length;
    	}
     
    	public Object getValueAt(int row, int column) {
    		return data[row][column];
    	}
     
    	public String getColumnName(int c) {
    		return columnNames[c];
    	}
     
    	public Class getColumnClass(int c) {
    		return Object.class;
    	}
     
    	public boolean isCellEditable(int row, int col) {
    		return editable;
    	}
     
    	public void setEditable(boolean editable) {
    		this.editable = editable;
    	}
     
    	public void setValueAt(Object value, int row, int col) {
    		String s;
    		if (col == 2) {
    			s = dc.getDateUS(value.toString());
    		} else {
    			s = value.toString();
    		}
    		if (!data[row][col].equals(value)) {
    			Connexion c = new Connexion();
    			StringBuffer sb = new StringBuffer("Update intervention set ");
    			sb.append(columns[col]);
    			sb.append(" = '");
    			sb.append(s);
    			sb.append("' where ");
    			for (int i = 0; i < data[row].length; i++) {
    				if (i != 0) {
    					sb.append(" and ");
    				}
    				sb.append(columns[i]);
    				sb.append(" = '");
    				sb.append(data[row][i].toString());
    				sb.append('\'');
    			}
    			if (c.insert(sb.toString()) == 1) {
    				data[row][col] = value;
    				//fireTableDataChanged();
    				//fireTableCellUpdated(row, col);				
    			}
    			c.close();			
    		}
    	}
     
    	public void setData(Object[][] data) {
    		this.data = data;
    		fireTableDataChanged();
    	}
     
    	private String[] columnNames = new String[0];
     
    	private Object[][] data = new Object[0][0];
     
    	private boolean editable = false;
     
    	private static final String[] columns = { "num_national", "type", "date",
    			"veto", "num_ordonnance", "medicament", "description" };
     
    	private Date_convert dc = new Date_convert();
     
    	private Date d = new Date(0);
    }
    et enfin le bout de code qui cree tous cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    data = c.selectTab(req);
    		im = new MyInterventionModel(data, s);
    		im.setEditable(true);
    		tt = new MyTableTrie(im);
    		t = new JTable(tt);
    		tt.addEcouteur(t);
    		cell.setColumnSize(t);
    		t.setDefaultRenderer(Object.class, cell);
    		t.getTableHeader().setDefaultRenderer(new MyHeaderRenderer());
    		t.setDefaultEditor(Object.class, cell);
    		JScrollPane js = new JScrollPane(t);
    		add(js);

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Je viens de nouveau d'essayer de modifier différentes méthodes, mais rien n'y fait, je ne trouve pas l'action qui fait cela.

    Y-a-t-il un moyen de connaitre l'ensemble des méthodes appelés et de les lister ?
    Genre de faire un debugg avec eclipse ?

    Le problème la c'est que je ne peux faire un mode debugg pas à pas, tout en sélectionnant une cellule

  5. #5
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Sous eclipse tu peux lancer une application en mode debug et faire tourner le programme ligne par ligne.

    Il faut mettre un point d'arret sur une ligne en doouble cliquant dans la marge de gauche de la ligne.
    Puis cliquer sur le bouton "Debug" à gauche de "Run" dans la barre d'outils.

    Si tu veux plus de precision, demande.

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    ok je connaissais cela.

    Mais le problème, c'est que pour mettre un pt d'arret il faut connaitre les méthodes utilisés, ce que je ne connais pas dans ce cas la.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 65
    Par défaut
    Mets un point d'arrêt au début de chacune de ces méthodes :
    cancelCellEditing
    stopCellEditing
    pour voir si elle sont appelées au moment adéquates puis sur
    setValueAt
    qui te permettra de voir quelles méthodes sont appelées pour faire la mise à jour de la donnée de la cellule (regarde la pile d'appel des méthodes dans le mode debug et remonte la pile d'appel pour comprendre ce qui se passe).

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Je viens de tester, le problème ne vient pas de ces classes la.

    Il vient d'évènements internes au JTable, mais je ne vois pas duquel, ni comment résoudre ce problème

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Bon c'est bon j'ai trouvé le problème.

    J'ai séparé mes classes editor et renderer et ca fonctionne maintenant.

    Mais si quelqu'un pouvait m'indiquer pourquoi ca ne fonctionne pas pareil.

    Parceque je partage l'objet peut-etre?

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Décembre 2004
    Messages : 201
    Par défaut
    Citation Envoyé par theyankee76

    Parceque je partage l'objet peut-etre?
    C'était ca en effet.

    Je partagais la même instance pour l'éditeur et le renderer, d'ou recopie.

    Avec 2 instances differentes de la même classe, ca passe.

    Erreur toute bête, mais qui pourra me servir un jour.
    Ca peut être utile la sélection recopie

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

Discussions similaires

  1. editeur personnalisé pour une colonne d'une JTable
    Par thierry_b dans le forum Composants
    Réponses: 1
    Dernier message: 22/07/2009, 13h43
  2. Probleme editeur JTable
    Par errog dans le forum Composants
    Réponses: 1
    Dernier message: 28/06/2008, 12h11
  3. jtable + jspinner + editeur
    Par bbclone dans le forum Composants
    Réponses: 6
    Dernier message: 29/05/2006, 18h08
  4. Editeur de MAP en delphi pour jeux directX
    Par PetitScorpion dans le forum DirectX
    Réponses: 5
    Dernier message: 09/07/2002, 18h47
  5. Editeur en mode console
    Par logramme dans le forum C
    Réponses: 5
    Dernier message: 11/06/2002, 13h23

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