Peut un Jtable enregistrer les données chaque fois qu'une cellule perd le focus?
Le haut niveau: j'ai une JTable qui permet à l'utilisateur de modifier les données.
Chaque fois que l'utilisateur appuie sur Entrée ou Tab pour terminer le montage, les données sont enregistrées (je suis asusming que "sauvé" signifie vraiment "le TableModel de setValueAt() la méthode est appelée".)
Si l'utilisateur quitte la cellule de toute autre manière après avoir fait une modification, les nouvelles données n'est pas enregistré et la valeur reste la façon dont elle était. Ainsi, par exemple, si l'utilisateur modifie une valeur, puis clique sur certains autres widget sur l'écran, le changement n'est pas "stick".
Je crois que c'est le comportement par défaut pour un JTable plein de Chaînes, oui?
Pour une variété de raisons, le comportement désiré est pour la cellule de sauvegarder toutes les modifications à chaque fois que l'utilisateur quitte la cellule. Quel est le meilleur/bon moyen de faire de la Balançoire pour ce faire?
Vous devez vous connecter pour publier un commentaire.
Tableau Arrêter La Modification explique ce qui se passe et donne un couple de solutions simples.
L'une des solutions les plus simples proposé
est seulement bonne pour les colonnes de la Chaîne. Le problème est que si j'ai, par exemple, de type Flotteur de la colonne en cours d'édition, entrez une chaîne vide dans la cellule correspondante, puis cliquez sur n'importe quel autre contrôle de la fenêtre – Java jette
NullPointerException
dansCellEditorRemover.propertyChange()
méthode deJTable.java
. Il utilisegetCellEditor()
appel pour arrêter ou annuler l'édition, mais il renvoienull
dans ce cas. Si la valeur entrée n'est pas vide ou si je supprimeterminateEditOnFocusLost
drapeau, tout est parfait. Sans doute, la situation décrite est un bug.J'espère que je peux fournir une solution basée sur l'un des posts précédents. Il n'est pas si trivial que j'ai supposé auparavant, mais il me semble qu'il fonctionne.
J'ai dû hériter de ma propre cellule de l'éditeur de cellule par défaut de l'éditeur et de mon propre champ de texte à partir
JTextField
qui aFocusListener
. Cette focalisation de l'écouteur fonctionne très bien lors de l'édition de cellule perd un accent, un accent acquise par un autre contrôle de la fenêtre. Mais dans le cas de sélection de cellule change le focus auditeur est “sourd”. C'est pourquoi je tiens aussi à vous rappeler auparavant valeur valide avant l'édition de commencer à restaurer si la valeur saisie n'est pas valide.Voir le code ci-dessous. Testé avec
Double
,Float
etInteger
, mais j'espère que cela fonctionnera aussi avecByte
etString
.Champ de texte avec un accent auditeur:
De cellule par défaut de l'éditeur de classe:
Le code d'initialisation de la table, il faut ajouter les suivants:
Espoir, cela vous aide à quelqu'un qui ont le même problème.
Vous avez besoin d'ajouter un l'accent auditeur. Étant donné que JTable est en fait un conteneur de ses composants de la cellule, vous voulez vraiment l'accent auditeur pour chaque cellule de votre tableau doit comporter de la manière que vous avez indiqué.
Pour ce faire, vous aurez besoin de créer des cellules de l'éditeur, qui enveloppe de la cellule composant qui a inscrit l'accent auditeur. Et quand vous avez la fonction de rappel pour la perte de focus de l'événement, vous effectuez la sauvegarde de données, comme vous le désirez.
Ce joli beaucoup de détails la plupart de ce que vous devez faire. Les détails de la mise en œuvre de l'accent auditeur n'est pas là, mais c'est assez simple.
Permet de dire que vous utilisez un JTextComponent que vos composants cellulaires. Alors:
[p.s. edit]:
Le fil qui vous appelle avec cet événement est le thread d'expédition. Ne PAS utiliser pour des actions à latence élevée. Mais si vous êtes juste en feuilletant les bits dans le tas, il devrait être ok.