2017-02-24 2 views
1

Comme nous le savons par défaut, nous devons appuyer sur la touche Entrée deux fois pour changer la sélection lors de l'édition d'une cellule dans JTable. Pour contourner ce comportement, j'essaie d'écrire un éditeur de cellule de tableau personnalisé. Lorsque la touche Entrée est enfoncée, la modification dans la cellule courante est terminée, la sélection est modifiée et la modification est lancée dans la nouvelle cellule sélectionnée. Le scénario entier fonctionne correctement pour les entiers mais pas pour le type de données FLOAT. pour les colonnes de type de données Float/Double i get erreurÉditeur de cellule de tableau personnalisé en Java avec type de données de colonne Flottant

java.lang.IllegalArgumentException: Impossible format donné comme objet d'un numéro

lorsque vous appuyez sur Entrée pour changer la sélection.

Toute aide à cet égard s'il vous plaît. J'utilise le code suivant, que j'ai trouvé lors d'une recherche en ligne.

package javaapplication1; 

import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.AbstractCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableColumn; 
import javax.swing.text.JTextComponent; 

/** 
* 
* @author alqama 
*/ 
public class test extends JPanel{ 

    private JTable table; 

    test() 
    { 
     table = new JTable(){ 

     @Override 
     public void changeSelection( int row, int column, boolean toggle, boolean extend) 
     { 
      super.changeSelection(row, column, toggle, extend); 

      if (editCellAt(row, column)) 
      { 
       Component editor = getEditorComponent(); 
       editor.requestFocusInWindow(); 
       ((JTextComponent) editor).selectAll(); 

      } 
     }}; 
     DefaultTableModel dtm = new javax.swing.table.DefaultTableModel(
       new Object [][] { 

        }, 
       new String [] { "Integer","Float"} 
      ) { 
       public Class getColumnClass(int col) { 
       if(col==0) return java.lang.Integer.class; 
       return java.lang.Float.class; 
      } 

      public boolean isCellEditable(int rowIndex, int columnIndex) { 
       return true; 
      } 
     }; 
     table.setModel(dtm); 
     CustomTableCellEditor et = new CustomTableCellEditor(table); 
     table.getColumnModel().getColumn(1).setCellEditor(et); 
     table.getColumnModel().getColumn(0).setCellEditor(et); 

     for (int i = 0; i < 5; i++) { 
      dtm.addRow(new Object[]{i,1.5+i}); 
     }  


     table.setPreferredScrollableViewportSize(new Dimension(123, 123)); 
     this.add(new JScrollPane(table)); 

    } 
    private void display() { 
     JFrame f = new JFrame("Test Table"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new test().display(); 
      } 
     }); 
    } 




    protected class CustomTableCellEditor extends AbstractCellEditor implements TableCellEditor { 

     private JTable table; 
     JTextField component = new JTextField(); 

     public CustomTableCellEditor(JTable table) { 
      this.table = table; 
     } 

     public boolean stopCellEditing() { 

      boolean ans = super.stopCellEditing();    
      return ans; 
     } 

     @Override 
     public void cancelCellEditing() { 
      super.cancelCellEditing(); 
     } 

     @Override 
     public Object getCellEditorValue() { 
      return component.getText();   
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable arg0, Object value, 
       boolean arg2, int arg3, int arg4) { 
      component.setText(value.toString()); 
      return component; 
     } 
    } 
} 
+0

Veuillez inclure votre implémentation de 'getColumnClass()' lorsque vous éditez votre question pour inclure un [mc ve] qui présente le problème que vous décrivez. – trashgod

+0

J'ai mis à jour le code ci-dessus avec un exemple complet. –

+0

J'ai mis à jour le code ci-dessus avec un exemple complet. Avec une seule touche ENTER, appuyez sur la colonne Entier, l'édition dans la cellule actuelle est terminée et la cellule suivante est sélectionnée directement en mode d'édition et sélectionnez Tout. Pour l'erreur de format de nombre flottant est soulevée. –

Répondre

1

la mise en œuvre du modèle que vous de getColumnClass() pour la colonne 1 retours Float.class, de sorte que votre mise en œuvre de getCellEditorValue() devrait retourner une valeur du même type:

@Override 
public Object getCellEditorValue() { 
    return Float.valueOf(component.getText());   

Comme alternative, vous pouvez spécifier l'éditeur par classe :

CustomTableCellEditor et = new CustomTableCellEditor(table); 
table.setDefaultEditor(Float.class, et); 
+1

Merci beaucoup. en utilisant ci-dessus, j'ai renvoyé le type entier pour la colonne 1 et le type flottant pour la colonne 2 et cela fonctionne très bien. –