2015-07-14 1 views
0

Vous tentez d'utiliser JTable.setDefaultEditor() mais il ne semble pas activer. Le définir spécifiquement pour une colonne fonctionne mais ne le définit pas comme l'éditeur par défaut. La commande println n'est pas renvoyée mais est visible lors de la définition d'une colonne spécifique.JTable.setDefaultEditor() ne fonctionne pas mais le réglage sur un champ spécifique fonctionne.

Existe-t-il une étape supplémentaire requise lors de la définition d'un éditeur par défaut?

import java.awt.*; 
    import javax.swing.*; 
    import javax.swing.table.TableCellEditor; 
    import javax.swing.table.TableColumn; 

    public class Main { 
     public static void main(String[] argv) throws Exception { 

     JFrame myFrame = new JFrame(); 
     myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     String columnNames[] = { "Column 1", "Column 2", "Column 3" }; 

     String dataValues[][] = 
     { 
       { "12", "234", "67" }, 
       { "-123", "43", "853" }, 
       { "93", "89.2", "109" }, 
       { "279", "9033", "3092" } 
      }; 
     JTable table = new JTable(dataValues, columnNames); 
     myFrame.getContentPane().add(table); 

     table.setDefaultEditor(String.class, new MyTableCellEditor()); 
    // TableColumn col = table.getColumnModel().getColumn(0); 
    // col.setCellEditor(new MyTableCellEditor()); 
     myFrame.pack(); 
     myFrame.setVisible(true); 
     } 
    } 

    class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor, FocusListener 
    { 

     JComponent component = new JTextField(); 

     public MyTableCellEditor() 
     { 
      component.addFocusListener(this); 
     } 

     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, 
      int rowIndex, int vColIndex) { 
      System.out.println("Inside getTableCellEditorComponent()"); 
     ((JTextField) component).setText((String) value); 

     return component; 
     } 

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

     @Override 
     public void focusGained(FocusEvent e) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void focusLost(FocusEvent e) { 
      System.out.println("Focus Lost"); 

     } 
    } 

Répondre

1

C'est l'une des raisons pour lesquelles je n'aime pas DefaultTableModel ...

Si vous changez table.setDefaultEditor(String.class, new MyTableCellEditor());-table.setDefaultEditor(Object.class, new MyTableCellEditor());, il fonctionnera, toutefois, une meilleure solution serait de remplacer la méthode de getColumnClass le DefaultTableModel

DefaultTableModel model = new DefaultTableModel(dataValues, columnNames){ 

    @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     // You really should be checking the columnIndex and 
     // returning the appropriate data type for the column, 
     // but you get the idea 
     return String.class; 
    } 

}; 
JTable table = new JTable(model); 
myFrame.getContentPane().add(table); 

table.setDefaultEditor(String.class, new MyTableCellEditor()); 

Jetez un oeil à How to Use Tables pour plus de détails

+0

-nous Object.class travaillé. Je vais devoir vérifier l'URL fourni un peu plus près que j'ai déjà jeté un coup d'oeil à cela, mais doit avoir manqué quelques informations. –

+0

Cela a à voir avec quelles informations 'DefaultTableModel' renvoie par défaut' getColumnClass', d'où la seconde suggestion;) – MadProgrammer