Posté(e) le 15 juillet 200718 a 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). Modifié le 18 juillet 200718 a par windu.2b
Posté(e) le 15 juillet 200718 a Dans ton TableModel, il faudrait que tu overrides la méthode isCellEditable().
Posté(e) le 16 juillet 200718 a Auteur 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é
Posté(e) le 17 juillet 200718 a Auteur 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
Posté(e) le 18 juillet 200718 a Auteur Ç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
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.