9
votes

Java JTable Detect Colonne Re-dimensionné par l'utilisateur

J'ai une jtalie qui utilise un TableColumnModellisener () Pour détecter lorsque la colonne a été repoussée et que j'ai du code que je veux exécuter dans le colonneMarginchanged () méthode.

Comment puis-je déterminer si la colonne a été redimensionnée par l'utilisateur ou à la suite d'un autre code?

Je pense que je dois commencer avec changeevent.getsource () mais je ne sais pas où aller de là.

merci.


3 commentaires

Sauf si vous le modifiez, la source sera toujours la de la table via FIRCOLUMNMarginchanged () . Quel problème essayez-vous de résoudre?


certainement pas. Répéter @ Trashgod's question: pourquoi?


Si votre code change la taille de la colonne, vous pouvez toujours désactiver ou supprimer l'écouteur avant la modification, apporter la modification, puis réactive ou ajouter l'auditeur à nouveau.


3 Réponses :


9
votes

Je peux vous donner une approche possible. J'essayais de résoudre le même problème, car je voulais sérialiser des informations sur les largeurs de colonne sur le disque, de sorte que la prochaine fois que le tableau s'est ouvert dans mon application, je pourrais restaurer les largeurs de colonne de manière appropriée. Voici:

Étape 1 - Remplacement de votre JTAble et ajoutez une propriété booléenne à celle-ci forte> p> xxx pré>

Étape 2 - Ajouter un TableColumnModellisener () à la table forte> p> xxx pré>

étape 3 - Ajoutez une auditeur de souris à l'en-tête de la table forte> p>

private class TableHeaderMouseListener extends MouseAdapter
{
    @Override
    public void mouseReleased(MouseEvent e)
    {
        /* On mouse release, check if column width has changed */
        if(tableObj.getColumnWidthChanged())
        {
            // Do whatever you need to do here

            // Reset the flag on the table.
            tableObj.setColumnWidthChanged(false);
        }
    }
}


3 commentaires

(N'avez pas tout à fait d'obtenir votre besoin - pourquoi ne faites-vous pas simple sauvegarde les largeurs toujours?) - Mais sur le marqueur: au lieu d'utiliser le curseur, qui est extrêmement fragile, comme vous l'avez déjà noté :-) Utilisez le résumé de l'en-tête : C'est! = NULL que lorsque un redimensionnement de l'utilisateur est en cours. C'est ainsi que JextableHeader prend en charge l'emballage et corrige le bogue de base gênant de déclencher une sorte même lors du redimensionnement ...


Comme vous l'avez souligné, une approche consiste simplement à sérialiser toutes les largeurs de colonne lorsque l'application est éteinte (peut-être via la méthode de visualisation de fenêtre d'un WindowListener). C'est peut-être la bonne approche pour la personne qui a posté cette question. La raison pour laquelle je dois sérialiser progressivement les largeurs de colonne est dû au fait que ma jtalie est détruite et recréée à partir de zéro à chaque fois qu'une rangée / col est créée / détruite. (Cela peut sembler bizarre, mais il y a une raison à cela que je ne peux pas divulguer dans un forum public.) Donc, seul le moyen de récupérer les largeurs d'origine consiste à les sérialiser progressivement.


Peut-être que je peux donner un peu plus de détails. :) Vous voyez, mon jtalle est un formulaire d'inscription pour un backend plus sophistiqué. Lorsque l'utilisateur modifie la JTABLE dans mon application, certaines choses sont construites automatiquement pour l'utilisateur en arrière-plan. Donc, mon jtalle est essentiellement un sorcier. Pour vous assurer que la table reflète exactement ce qui a été construit automatiquement en arrière-plan, je dois analyser les objets construits automatiquement et recréer la table. Si je ne fais pas cela, il y a un danger (en raison de l'erreur de programmation) que la table et les objets construits automatiquement commencent divergent et il n'y a plus une vérité.



4
votes

Vous voulez généralement être informé d'une glisser-colonne terminée, ou une colonne remplie redimensionnée. Par exemple xxx

Ce n'est pas joli mais cela fera ce que vous voulez: xxx

ajoutez-le au tableau comme suit: xxx


0 commentaires

2
votes

Une solution plus simple pourrait simplement être à écouter sur l'événement de sortie de la souris (ce qui ne se produit qu'une seule fois dans cette interaction utilisateur) et vérifiez si les tailles de colonne ont changé entre-temps? J'utilise le code ci-dessous pour écouter les modifications de la réorganisation et de la taille des colonnes.

getTableHeader().addMouseListener( new MouseAdapter() {
    public void mouseReleased(MouseEvent arg0)
    {
      String colNamesAndSizes = "";
      for( int i=0;i<getColumnModel().getColumnCount();i++ ) {

        if( i>0 ) colNamesAndSizes += ",";
        TableColumn column = getColumnModel().getColumn(i);
        colNamesAndSizes += column.getHeaderValue();
        colNamesAndSizes += ":";
        colNamesAndSizes += column.getWidth();
      }
      // check if changed, if yes, persist...
   }});


1 commentaires

Facilité de persister avec une carte . Excellent.