2012-12-13 1 views
2

Mon code est vraiment trop long pour être affiché ici, même par petites portions. Je vais simplement demander une ou deux choses: Il me semble que lors de la modification de la propriété « Données » d'un uitable « ht »:Uitable, celluleSelectionCallback et jeu de données de modification

set(ht, 'Data', something); 

que la routine « de cellSelectionCallback » est déclenchée (comme la sélection est très susceptible d'avoir changé, en effet), mais pas immédiatement après la modification de l'ensemble de données.

  1. Est-ce vrai?
  2. Y a-t-il un moyen de prévenir un tel comportement?

Merci!

Répondre

2

Je code à l'aide d'un uitable, par exemple:

tbl = uitable('Parent', fh, 'CellSelectionCallback',{@cell_select_callback fh}); 

J'ai fait une expérience rapide et lors de l'utilisation set(tbl,'Data',my_data) le rappel est déclenchée que si le set provoque la cellule sélectionnée (s) pour changer, et cela arrive immédiatement (pour autant que je sache - je n'ai vu aucun retard appréciable).

Pour arrêter cela, vous pouvez simplement annuler la propriété CellSelectionCallback, modifier les données, puis réinitialiser CellSelectionCallback.

+0

Merci pour votre réponse. Je n'ai pas pensé à ça, je vais essayer. – embrouille

+0

N'hésitez pas à accepter la réponse! – Justin

+0

Ok, donc cela n'a pas résolu mon problème (lors de la réinitialisation de cellSelectionCallback, le callbacki est toujours appelé, dans mon programme au moins). J'ai réussi à éviter le problème en utilisant la méthode setValueAt (val, row, col) de la JTable attachée à l'uitable. De cette façon, la propriété 'Data' n'est pas modifiée et la fonction de rappel n'est pas déclenchée. Merci pour votre aide de toute façon. – embrouille

1

J'ai eu le même problème. A reçu des avertissements index out of bounds. Pour se débarrasser de ceux que j'ai utilisé dans mon CallSelectionCallback:

if ~isempty(eventdata.Indices) 
// all the code 
end 

Lorsque la commande set déclenche l'CallSelectionCallback le eventdata.Indices est vide.

1

Une possibilité similaire à la réponse de Sébastien est de mettre dans votre fonction cellselectioncallback:

function output = mycellselection(source,event) 

if isempty(event.Indixes) 
    output = []; 
    return 
end 
% rest of your code for cell selection 

end 

Si vous n'avez pas besoin de sortie, vous pouvez simplement le supprimer. Je l'ai juste mis là pour vous rappeler que vous devez attribuer une valeur à toutes les sorties.

Questions connexes