IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

[JScrollPane] [JTable] Se placer à la dernière ligne


Sujet :

Composants Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Par défaut [JScrollPane] [JTable] Se placer à la dernière ligne
    Bonjour,

    J'ai un JScrollPane contenant un JTable. J'Utilise windows XP avec java 1.4.2_04.
    Lors de l'ouverture de mon programme ou lorsque j'ajoute une ligne, je veux positionner le scroll vertical à la fin (en bas completement quoi...) du JTable....
    Facile direz vous, et j'en convient, mais il y a un bug asser fatiguant..., le scroll se positionne toujours à l'avant dernière ligne, laissant la dernière ligne que je vien d'ajouter non visible sans une intervantion manuelle....
    Après différent test, je réussit à faire fonctionne lors de l'ouverture du programme, mais jamais lors de l'ajout d'une nouvelle ligne....
    Voilà le code qui fonctionne lorsque j'ouvre le programme mais pas lorsque j'ajoute une nouvelle ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	jScrollPaneTable.getVerticalScrollBar().setMaximum(jScrollPaneTable.getVerticalScrollBar().getMaximum() + 16);
    jScrollPaneTable.getVerticalScrollBar().setValue(jScrollPaneTable.getVerticalScrollBar().getMaximum());
    Ce code est appleé après que tous mes éléments (JButtons et cie...) soi initialiser avec leur contenu. Je dois rajouter le +16 (hauteur d'une ligne dans mon JTable) sinon à l'ouverture le scroll se place à l'avant dernière ligne.
    J'ai ausis essayé ce bout de code, mais sans succès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int i = (jTableDataConcil.getRowHeight() * jTableDataConcil.getRowCount());
    Point p = new Point(0, i);							jScrollPaneTable.getViewport().setViewPosition(p);
    Avec ce code, ça fonctionne seuelment si le scroll est déjà en bas complètement, sinon, ca se place seuelment à l'avant dernière ligne.

    Mon hypothèse c'est que le JTable n'est redesinner seulement lorsque tout le code est fini d'exécuter, c'est pourquoi le scroll se positionne à la dernière ligne mais lorsque le JTable est redesinné, il se retrouve à l'avant dernière ligne lorsque j'ajoute une ligne.
    Alors comment éviter cela?

    J'ai vérifié avec des recherche sur google et sur le site de sun ainsi que dans leur bug database, mais rien...

    Merci

    Francis

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Par défaut
    J'ai fais plusieurs autres tests, mais toujours rien.
    Cette scrollbar ne veux pas se placer en bas complètement.
    Si vous avez une idée alternative ou la solution miracle, merci d'avance, sinon, je vais chnager de statégie pour mon prog.

    Francis

  3. #3
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Par défaut
    et pourquoi ne pas dessendre ta barre une fois que le Jtable est dessiné ..

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Par défaut
    Citation Envoyé par regis1_1
    et pourquoi ne pas dessendre ta barre une fois que le Jtable est dessiné ..
    C'est ce que je fais lors de l'ouverture de mon prog (le JTable se remplis à partir de donnée enregistré dans un fichier)
    Par contre, lorsque j'ajoute un nouvel enregistrement au JTable (par le JTableModel) et que je tente de place la barre en bas complètement, impossible, il se possitionne seuelment à l'avant dernier.....
    C'est comme si Java ne redesinne pas le JTable au même moment lors de l'ouverture du prog que lors de l'ajout de donné à l'intérieur, pourtant, mon code pour placer la barre s'exécute au même moment dans les 2 cas....

  5. #5
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 47
    Par défaut
    je ne pense pas avoir ete suffisemment explicite en fait je te proposait de deplacer la barre a l'interieur meme de la fonction qui redessine le composant il faut que tu le redefinisse pour faire ca par contre je ne sais plus quelle est la methode d'un composant swing qui la redessine ( repaint() ou paint() peut etre ...) tu pourra le faire en definissant un constructeur qui puisse accepter ton jScrollPanelTable.getVerticalScrollBar() comme parametre et tu redefini ta methode repaint() (si c'est celle la biensur) de cette maniere

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void repaint() {
    super.repaint();
    jScrollPaneTable.getVerticalScrollBar().setMaximum jScrollPaneTable.getVerticalScrollBar().getMaximum() + 16); 
    }
    j'ai pas testé mais a mon avis tu pourra pas positionner ta barre beaucoup plus tard

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Par défaut
    Merci,
    je vais tester ça dans les prochains jours!

    Francis

  7. #7
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Par défaut reponse
    final JScrollBar vsb = xxxx.getVerticalScrollBar();
    int min = vsb.getMinimum();
    int max = vsb.getMaximum();
    int visibleAmount = vsb.getVisibleAmount();
    int factor = (int)(visibleAmount/2.0);
    final int value = ((int)Math.ceil( max-min ))- factor;
    if(value > 0) {
    EventQueue.invokeLater(new Runnable() { //<- on ajoute le positionnement dans le queue des evenements a effectuer
    public void run() {
    vsb.setValue(value);
    }
    });
    }

  8. #8
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Par défaut complement
    Pour une JTable, normalement tu as un modele qui etend AbstractTableModel
    et pour ajouter une ligne tu as due ajouter une methode
    ce qui doit faire
    public void addBigniou(Bigniou bigniou){
    this.liste.add(bigniou);
    fireTableRowsInserted(liste.size()-1, liste.size()-1);//Ca évite de faire un repaint...
    //puis le code que j'ai mis juste avant pour positionner a la fin
    }

  9. #9
    Membre très actif
    Profil pro
    developpeur
    Inscrit en
    Septembre 2010
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Septembre 2010
    Messages : 220
    Par défaut jtable qui se positionne à la fin
    Dans mon application, je reload le jtable à chaque insert donc le firetable ne fonctionne pas
    mais ...j'ai trouvé ce bout de code qui fonctionne à merveille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // model constructor & JTable creation/load
    	em       = new EmployeeSwipeModel(userId);
    	tSwipe  = new JTable(em);
     
    // scroll to the end of jtable
    	tSwipe.addComponentListener(new ComponentAdapter() {
    		   public void componentResized(ComponentEvent e) {
    		    	tSwipe.scrollRectToVisible(tSwipe.getCellRect(tSwipe.getRowCount()-1, 0, true));
    		    }
    	});

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si le but est de se placer à la dernière ligne de la JTable à chaque insertion de nouvelle ligne, ce n'est pas ce que fait ton ComponentListener : il se positionne à la fin lorsqu'on redimensionne la JTable (ce qui répond à la question, mais uniquement au premier affichage).

    Si on veut que la JTable scrolle automatiquement à la dernière ligne, sauf si on est en train de regarder une autre ligne que la dernière (ce qui est peut être génant sinon), on peut agir sur le JScrollPane :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    scrollpane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {  
     
        private int lastmax=-1;
     
        public void adjustmentValueChanged(AdjustmentEvent e) {  
        if ( !e.getValueIsAdjusting() ) {
    	int max=e.getAdjustable().getMaximum();
    	int pos=e.getAdjustable().getValue();
     
    	if ( lastmax==-1 || lastmax==pos+e.getAdjustable().getVisibleAmount()) {
    	    e.getAdjustable().setValue(max);  
    	}
    	lastmax=max;
    	}
        }
     
    });
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/11/2013, 22h47
  2. Ma JTable n'affiche que la dernière ligne
    Par sam14 dans le forum Débuter
    Réponses: 3
    Dernier message: 19/04/2012, 11h29
  3. Réponses: 3
    Dernier message: 19/01/2010, 16h22
  4. [JTable] Insérer à la dernière ligne vide
    Par jamalmoundir dans le forum Composants
    Réponses: 1
    Dernier message: 31/05/2006, 23h15
  5. Réponses: 9
    Dernier message: 12/08/2002, 07h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo