2010-09-02 8 views
1

Comme l'indique le titre, j'ai un JTable et je ne peux pas éditer des colonnes "arbitraires". J'ai 4 colonnes et seule la première colonne est éditable. La première colonne contient des fichiers et un éditeur spécial, les deux colonnes suivantes ont des chaînes et la dernière colonne a des entiers. J'utilise un modèle personnalisé et je renvoie true à partir de la méthode isCellEditable. Bien sûr, j'ai d'abord consulté plusieurs sites Web pour obtenir de l'aide, mais je n'ai rien trouvé qui m'aide. J'ai utilisé le code source Java pour remplacer plusieurs méthodes JTable et insérer des instructions d'impression. En particulier, j'ai trouvé que table.editCellAt (ligne, col) renvoie toujours false car le composant d'édition retourné par l'éditeur de cellule est toujours null. Donc, j'ai naturellement essayé de remplacer l'éditeur en utilisant table.setDefaultEditor(String.class, new MyEditor()). Étrangement, cela n'a pas travaillé. Tous les éditeurs pour les colonnes String étaient toujours le GenericEditor que JTable utilise par défaut. J'ai ensuite essayé d'ajouter les rédacteurs à chaque colonne en procédant comme suit:Impossible d'éditer des colonnes JTable apparemment arbitraires

TableColumnModel model = table.getColumnModel(); 
for(int i = 1; i < model.getColumnCount(); i++){ 
    model.getColumn(i).setCellEditor(new MyEditor()); 
} 

Notez que i commence à 1 parce que la première colonne a déjà un éditeur approprié. Je suis à court d'idées à ce stade, alors je suis venu à la bonne personne à Stack Overflow pour de l'aide.

Edit: J'utilise un DefaultTableModel, je simplement l'emportaient sur isCellEditable pour vous assurer qu'il retourne toujours vrai (même si DefaultTableModel est censé faire être par défaut). Je l'ai fait pour réduire le nombre de réponses de débogage inutiles et inutiles. De plus, le fait qu'une colonne soit modifiable mais que d'autres ne le soient pas semblerait indiquer que le problème est ailleurs.

Éditer: Il semblerait que le problème repose sur la création de colonnes. Un professeur a suggéré de changer setAutoCreateColumnsFromModel et il semble avoir résolu le problème.

+1

Vous avez un code personnalisé et cela ne fonctionne pas? Eh bien c'est où je commencerais. Commencez par faire fonctionner le code en utilisant les classes fournies avec le JDK. Utilisez le DefaultTableModel pour cela. Ensuite, une fois que vous avez prouvé que cela fonctionne, vous faites un changement à la fois avec votre code personnalisé. Quand il cesse de fonctionner, vous savez où est le problème et vous pouvez poster votre SSCCE (http://sscce.org) montrant le problème. – camickr

+0

@gerenba: J'ai migré vos informations supplémentaires à la question. S'il vous plaît revenir si incorrect. – trashgod

+0

Le tutoriel Swing a un exemple simple qui utilise DefaultTableModel, qui peut être une bonne fondation SSCCE. http://download.oracle.com/javase/tutorial/uiswing/components/table.html – trashgod

Répondre

0

J'utilise un DefaultTableModel, je remplace simplement isCellEditable pour m'assurer qu'il renvoie toujours vrai (même si DefaultTableModel est supposé faire cela par défaut). Je l'ai fait pour réduire le nombre de réponses de débogage inutiles et inutiles. De plus, le fait qu'une colonne soit modifiable mais que d'autres ne le soient pas semblerait indiquer que le problème est ailleurs.

+0

@Brett Geren, @gerenba: J'ai migré vos informations supplémentaires à la question, vous pouvez donc supprimer cela. Merci d'utiliser une seule identité sur le site. – trashgod

1

Il suffit de 5 lignes de "code personnalisé" pour tester l'utilisation d'un JTable. Le reste du code est un modèle pour tout SSCCE que vous pourriez créer dans le futur.

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

public class SSCCE extends JPanel 
{ 
    public SSCCE() 
    { 
     DefaultTableModel model = new DefaultTableModel(5, 3); 
     JTable table = new JTable(model); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("Basic SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SSCCE()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
0

Il semblerait que le problème repose sur la création de colonnes. Un professeur a suggéré de changer setAutoCreateColumnsFromModel et il semble avoir résolu le problème.

+0

@Brett Geren, @gerenba: J'ai migré vos informations supplémentaires à la question, vous pouvez donc supprimer cela. Merci d'utiliser une seule identité sur le site. – trashgod

+0

À droite, et comment pourrions-nous deviner que vous utilisez cette méthode puisque aucun des exemples du tutoriel Swing n'utilise cette méthode. C'est pourquoi vous devriez poster un SSCCE avec chaque question. – camickr

Questions connexes