9
votes

Quelle est la meilleure façon d'écouter les modifications des valeurs de cellule JTAble et de mettre à jour la base de données en conséquence?

Je bâche et apps à l'application avec plusieurs jtales et je dois détecter lorsque la valeur de la valeur de cellule se produit afin que je puisse la mettre à jour dans la base de données. J'ai essayé Tablodellisener et remplacement tablechanged , mais il tire uniquement lorsque je clique sur l'extérieur (cliquez sur une autre ligne) après avoir édité une cellule.

Tout autre moyen de faire cela?


4 commentaires

Je pense que cela est possible d'ajouter auditeur, tout dépend de votre xxxcelleditor, mais la manière plus sûre pourrait être en attente de la cellule validée sur stopcelledit (pareil avec msexcell, sans vba / vbe), sinon vous avez en danger


@mkorbel quel genre d'auditeur? J'ai déjà essayé Tablodellisener.


ne pas ajouter d'auditeur approprié au jcomponent qui représentant l'éditeur,


Si possible, j'essaierais d'attendre que SetValUeat sur le modèle de table est appelé, personnellement


4 Réponses :


5
votes

Je suis d'accord avec @mkorbel - à moins que toutes vos entrées sont des cases à cocher et des déposées, vous souhaitez attendre que l'édition de cellule soit arrêtée (vous ne voulez pas vous engager dans la base de données à chaque fois qu'une lettre est une lettre. dactylographié dans une zone de texte).

Si le problème est que cela ne vous engage pas après la mise au point est allé à un autre composant, ajoutez un FocusListener qui arrête de modifier la table lorsque la mise au point est perdue sur la table:

: xxx


5 commentaires

Merci, cela semble prometteur. Je vais l'essayer. Mais si le programme est fermé avant que la mise au point ne soit perdue?


Sauf si c'est une fermeture naturelle (non tuée par le gestionnaire de tâches ou une personne qui utilise System.exit dans le code), je suis sûr que l'adaptateur perdu de l'accent sera mis à feu. Sinon, il y a aussi le WindowListener qui écoute pour la fermeture de la fenêtre.


Nope, ça ne tire pas. Mais, j'arrête Cell Modifier sur l'application Sortie :) Pour toutes les tables. J'ai utilisé le code plus simple d'@ Trashgod pour arrêter l'édition lorsque la mise au point est perdue et je ne peux pas décider que je ne peux pas décider si je devais enregistrer toutes les modifications à la sortie ou utiliser l'auditeur de modèles de table. Je suis sûr que les deux vont travailler maintenant, mais quelle réponse dois-je choisir? J'ai utilisé le code de Trahsgod pour édition de cellules SOP et votre idée de s'en tenir à ne pas vous contacter chaque fois qu'une lettre est saisie.


Etrange - il semble que je dois être sûr de plus de 90% des choses. Bon à savoir!


@Igor: Pour référence, java.util.preferences fait un effort (spécifique à la plate-forme) pour enregistrer la dernière valeur mettre () .



21
votes

5 commentaires

+1 ooo ... j'aime bien. Dommage que ces propriétés soient ennuyeuses / difficiles à trouver de la documentation sur.


Pensez-vous que c'est une bonne idée d'utiliser Tablodellisener et TableChanged () `?


Hors du contexte, bonne est difficile à mesurer. Essayez de couvrir toutes les chemins de sortie normaux et utilisez un onduleur.


@trashgod et comment diriez-vous jtextarea / jtextpane ? Existe-t-il un auditeur d'événement similaire à celui-ci, où je n'ai pas à utiliser DocumentListener et mettre à jour la base de données à chaque fois qu'un personnage est entré? Un événement qui déclenche sur " jtextarea fin d'édition" Si ce que je suis après.


Vous pouvez bloquer une copie de travail du contenu dans java.util.preferences , en tant que couverture et effacer sur la base de données commit. vk_enter est lié à insert-break , de sorte que vous auriez besoin d'un autre geste.



0
votes

J'utilise la touche Entrée afin que chaque fois qu'un utilisateur appuie entrer dans la cellule mettra à jour.

    DefaultTableModel dtm = new DefaultTableModel(data, columnNames);
    JTable table = new JTable(dtm);

    table.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {

                int row = table.getSelectedRow();
                int column = table.getSelectedColumn();

                // resul is the new value to insert in the DB
                String resul = table.getValueAt(row, column).toString();
                // id is the primary key of my DB
                String id = table.getValueAt(row, 0).toString();

                // update is my method to update. Update needs the id for
                // the where clausule. resul is the value that will receive
                // the cell and you need column to tell what to update.
                update(id, resul, column);

            }
        }
    });


1 commentaires

Carte Kyebindings pas Keylistener



0
votes

Ceci est également pratique si vous souhaitez arrêter l'édition sur un gestionnaire d'événements à partir du bouton de sélection ou de sauvegarde.

if (table.isEditing())
    table.getCellEditor().stopCellEditing();


0 commentaires