2009-01-19 7 views
0

Je cherchais une réponse pour un previous question et ai eu une idée ingénieuse pour surmonter une limite sur JTable. J'ai besoin que l'éditeur soit différent ligne par ligne, alors que JTable ne peut gérer qu'un seul éditeur pour chaque colonne.refresh setCellEditor pour JTable

Donc mon idée est d'utiliser un MouseListener pour vérifier la ligne et la colonne sur le JTable et définir un nouvel éditeur à chaque fois. Mais, appeler le setCellEditor() une seconde fois n'a aucun effet. L'éditeur reste à être le premier qui a été mis en place. Alors, comment faire fonctionner "setCellEditor" une seconde fois pour la même colonne?

Voici le code MouseListener.

public void mouseClicked(MouseEvent e) { 
    int cols = resultTable.columnAtPoint(new Point(e.getX(), e.getY())); 
    int rows = resultTable.rowAtPoint(new Point(e.getX(), e.getY())); 
    StorageObject item = (StorageObject) resultTable.getModel().getValueAt(rows, cols); 
    TableColumn col = resultTable.getColumnModel().getColumn(cols); 
    col.setCellEditor(new MyComboBoxEditor(item.list)); 
} 

Répondre

3

Je ne sais pas pourquoi votre code ne fonctionne pas (il a été un moment que je l'ai fait Swing), mais pourquoi ne pas simplement passer outre

public TableCellEditor getCellEditor(int row, int column) 

Sur votre JTable? Conservez une carte des zones de liste déroulante que vous souhaitez utiliser pour chaque ligne et, dans votre méthode overrid, renvoyez la bonne.

+0

oui. C'est ainsi que vous gérez plusieurs types d'éditeur pour une seule colonne. –

1

Ma théorie est que lorsque tous les auditeurs de souris enregistrés à la table/TableCell sont invoquées, ceux installés aux classes de l'API par défaut seront appelées d'abord, avant que votre écouteur de souris. Cela signifie que l'événement provoquant l'extraction de l'éditeur se produira avant que vous le définissiez à un événement différent. Un peu comme une condition de concurrence, seulement il est défini quelque part dans le code source de l'API ... C'est ma théorie naïve et je peux déjà voir quelques trous dedans, donc sur ma solution:

Surcharger JTable.getCellEditor(int row, int col). Cela vous permet de retourner n'importe quel éditeur pour n'importe quelle cellule.