windu.2b Posté(e) le 15 juillet 2007 Partager Posté(e) le 15 juillet 2007 Bonjour, J'ai un problème avec un JTable que j'ai créé: j'ai dans une case de chaque ligne, un JSpinner pour pouvoir modifier la quantité d'un produit (à raison d'une ligne par produit dans mon JTable). Le code est le suivant: private TableCellRenderer getQuantiteRenderer() { return new DefaultTableCellRenderer() { /** * */ private static final long serialVersionUID = 2082226634566564026L; @Override public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column ) { JSpinner spinner = new JSpinner( new SpinnerNumberModel( Integer .parseInt( value.toString() ), Integer.MIN_VALUE, Integer.MAX_VALUE, 1 ) ); spinner.setEnabled( true ); return spinner; } }; } Cette méthode est bien appelée, et elle permet de définir comment mon élément doit être dessiné dans la case. L'élément est dessiné correctement, sauf qu'il n'est pas modifiable via les flèches 'haut' et 'bas' propres à tout JSpinner (elles sont grisées). Par contre, j'arrive à modifier la valeur en modifiant ce que la méthode reçoit en paramètre 'value' (par un appel de code Java, je peux donc modifier comme je veux cette valeur affichée, mais pas par un clic). L'appel à cette méthode se fait depuis cette autre méthode (Il s'agit de la 2° ligne dans la méthode): /** * Sets column renderers. */ private void setColumnRenderers( UserPreferences preferences ) { TableCellRenderer checkRenderer = getDefaultRenderer( Boolean.class ); TableCellRenderer quantiteRenderer = getQuantiteRenderer(); TableCellRenderer nameRenderer = getProductNameRenderer(); TableCellRenderer priceRenderer = getPriceRenderer( preferences ); TableCellRenderer priceTotalRenderer = getPriceRenderer( preferences ); TableCellRenderer[] columnRenderers = { checkRenderer, quantiteRenderer, nameRenderer, priceRenderer, priceTotalRenderer }; TableColumnModel columnModel = getColumnModel(); for ( int i = 0, n = getColumnCount(); i < n; i++ ) { columnModel.getColumn( i ).setCellRenderer( columnRenderers[i] ); } } J'ai d'ailleurs le même problème avec un JCheckBox, qui est appelée par la 1° ligne de la méthode ci-dessus (dans ce cas, je fais appel à la méthode par défaut déjà incluse dans Java, je ne l'ai donc pas codée moi-même). Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sentinel Posté(e) le 15 juillet 2007 Partager Posté(e) le 15 juillet 2007 Dans ton TableModel, il faudrait que tu overrides la méthode isCellEditable(). Lien vers le commentaire Partager sur d’autres sites More sharing options...
windu.2b Posté(e) le 16 juillet 2007 Auteur Partager Posté(e) le 16 juillet 2007 Désolé de pas avoir répondu plus tôt: hier soir j'ai décroché du développement, et j'ai plus pensé à regarder si des réponses étaient arrivés! Je te dis ça ce soir, si tout s'est bien passé Lien vers le commentaire Partager sur d’autres sites More sharing options...
windu.2b Posté(e) le 17 juillet 2007 Auteur Partager Posté(e) le 17 juillet 2007 Bon, ça marche pas encore comme il faut! J'ai bien fait un override de la méthode isCellEditable (int rowIndex, int columnIndex ), tout se passe bien de ce coté, mais quand je clique, ça ne coche toujours pas! Et pourtant, j'ai fait ceci: private void addMouseListener( final ProductController controller ) { addMouseListener( new MouseAdapter() { @Override public void mouseClicked( MouseEvent ev ) { if ( ev.getClickCount() == 1 ) { int columnIndex, rowIndex; Point p = ev.getPoint (); columnIndex = columnAtPoint ( p ); rowIndex = rowAtPoint ( p ); System.out.println( getValueAt( rowIndex, columnIndex ) ); if( getValueAt( rowIndex, columnIndex ) == Boolean.FALSE ) setValueAt( Boolean.TRUE, rowIndex, columnIndex ); else setValueAt( Boolean.FALSE, rowIndex, columnIndex ); System.out.println( getValueAt( rowIndex, columnIndex ) ); } else if ( ev.getClickCount() == 2 ) { // TODO gérer l'ajout via un double-clic System.out .println( "Double-clic dans ProductTable.addMouseListener()" ); controller.modifySelectedProduct(); } } } ); } Comme on le voit, lorsque je fais un simple-clic, ça doit récupérer la ligne et la colonne cliquée, et afficher son état avant et après modification. Sauf que setValue() ne semble pas changer la valeur! J'ai toujours 'false' qui s'affiche Lien vers le commentaire Partager sur d’autres sites More sharing options...
windu.2b Posté(e) le 18 juillet 2007 Auteur Partager Posté(e) le 18 juillet 2007 Ça y est j'ai réussi!!! bon, je vous mets le code de ma méthode, si cela peut en aider d'autres, servez-vous c'est là pour ça : private class BooleanCellEditor extends AbstractCellEditor implements TableCellEditor, TableCellRenderer, ItemListener { /** * */ private static final long serialVersionUID = -1131836209327529209L; JCheckBox jCheckBox = new JCheckBox(); int currentRow; int currentColumn; public Component getTableCellEditorComponent( JTable jTable, Object value, boolean isSelected, int rowIndex, int vColIndex ) { currentRow = rowIndex; currentColumn = vColIndex; jCheckBox.setHorizontalAlignment( SwingConstants.CENTER ); boolean bValue = ( ( Boolean ) value ).booleanValue(); if ( bValue == false ) { return null; } else { // Fixer l'état de départ jCheckBox.setSelected( bValue ); jCheckBox.addItemListener( this ); return jCheckBox; } } public Object getCellEditorValue() { return Boolean.valueOf( jCheckBox.isSelected() ); } @Override public boolean isCellEditable( EventObject evt ) { if ( evt instanceof MouseEvent ) { // For single-click activation int clickCount = 1; return ( ( MouseEvent ) evt ).getClickCount() >= clickCount; } return true; } public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column ) { // Create a panel and add the check box to it. JCheckBox checkBox = new JCheckBox(); checkBox.setHorizontalAlignment( JLabel.CENTER ); checkBox.setSelected( ( ( Boolean ) value ).booleanValue() ); return checkBox; } public void itemStateChanged( ItemEvent e ) { if ( e.getSource() instanceof JCheckBox ) { //TODO je sais pas encore quoi y mettre } } } Et merci encore, Sentinel Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.