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 :

Défilement automatique JTable


Sujet :

Composants Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut Défilement automatique JTable
    Bonjour ,

    J'ai une JTable dans un JScrollPane.
    Dans une boucle for , je met à jour les valeurs du tableau.
    Tout marche bien et le JSCrollPane aussi.

    Le tableau est trop petit pour le JScrollPane donc le scroll vertical se met correctement et je le deplace à la souris.

    Maintenant, je cherche à faire défiler automatique mon tableau au fur et a mesure que les valeurs s'inscrivent.

    C'est une histoire de focus , mais je ne trouve pas l'astuce

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Est ce qu'on peut commander un JScrollPane ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Personne me réponds

    Si la réponse est ailleurs dites le moi

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Lorsque tu ajoutes une nouvelle valeur procède de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myScrollPane.getVerticalScrollBar().setValue(myScrollPane.getVerticalScrollBar().getMaximum());

  5. #5
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    tu peux essayer ce genre de truc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        public void ensureAsVisible(int row)
        {
            if ( row < this.getModel().getRowCount() && row >= 0)
            {
                // ILogger.debug("Row [" + row + "] should be visible now");
                Rectangle rec = this.getCellRect(row, 0, true);
                this.scrollRectToVisible(rec);
            }
        }
    dans une classe surchargeant la JTable

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Merci a vous deux, la soluce de xixi31 me conviens mieux.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Avec ta soluce xixi , j'ai un problème, lorsque je descends à la souris la scrollbar vertical au moment ou le tableau recommence à se remplir à la premiere ligne, alors le tableau se voit rajouter 3-4 lignes blanches à la fin et le programme se plante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    c.table.setRowSelectionInterval(i, i);	
    c.table.setSelectionBackground(Color.green);
    c.table.setValueAt("ON",i,3);
    if ( i < c.table.getModel().getRowCount() && i >= 0)
    {     
    Rectangle rec = c.table.getCellRect(i, 3, false);
    c.table.scrollRectToVisible(rec);
    }

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Ce code devrait être exécuté dans l'EDT ? Est-ce que c'est le cas ?

    a++

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Edt ? Il est executé dans le run d'un classe extends Thread

  10. #10
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    EDT = Event Dispatching Thread,

    c'est le thread dans lequel doivent être effectué tous les appels modifiant ton interface graphique

    pour plus de détail : http://gfx.developpez.com/tutoriel/j...ing-threading/

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Ok merci , je le lis ça à l'air important

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Ok je comprends un peu mieux, mais j'y arrive pas , voilà la méthode que j'ai prise :
    C'est le run de ma classe Cycle.
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    	public void run()
    	{	
     
     
     
    	Runnable code = new Runnable() {
    	public void run() {
     
    		try
    		{
    			while(!finThread)
    			{		
    			for(int i=0; i< c.nbelt;i++ )
    				{
    					testFin(); // Vérifie si doit être en pause
    					c.updateUI();
    					if(c.data[i][2].equals(true)) //Si valeur
    					{
    						ping = new Ping_icmp(c.data[i][0].toString());
    						String appareil = c.data[i][0].toString();
     
    						/*
    						 * L'élément est Online.
    						 */
    						if(ping.retourne())
    						{
     
    							/*
    							 * La ligne passe au vert
    							 */
    							c.table.setRowSelectionInterval(i, i);	
    							c.table.setSelectionBackground(Color.green);
    							c.table.setValueAt("ON",i,3);
     
    							if ( i < c.table.getModel().getRowCount() && i >= 0)
    								{     
    								Rectangle rec = c.table.getCellRect(i, 3, false);
    								c.table.scrollRectToVisible(rec);
    								}
     
    						alerteD(appareil);
    						}
     
     
    						/*
    						 * L'élément est Offline.
    						 */
    					else
    						{
     
    						/*
    						 * La ligne passe au rouge
    						 */
    						c.table.setRowSelectionInterval(i, i);
    						c.table.setSelectionBackground(Color.red);
    						c.table.setValueAt("OFF",i,3);	
     
    							if ( i < c.table.getModel().getRowCount() && i >= 0)
    								{
    								Rectangle rec = c.table.getCellRect(i, 0, true);
    								c.table.scrollRectToVisible(rec);
    								}
    							alerteM(appareil);
    						}
    					}else; //Fin si valeur
     
    				if(finThread)i=c.nbelt; //met fin au Thread principal
    				}
    			majColonnes(); // On met à jour la liste des nom,type et supervisé ou pas
    		}
     
     
    	}
    		catch(Exception eq){
    			eq.printStackTrace();
    		}
     
     
        }
      }; //fin Runnable
     
     
     
      if (SwingUtilities.isEventDispatchThread()) {
    	    code.run();
    	  } else {
    	    SwingUtilities.invokeLater(code);
    	  }
     
     
    }
    L'interface se bloque completement comme ca

    Noter que la création de l'objet Ping_icmp se déroule correctement

  13. #13
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    ce n'est pas ton code entier qui doit être lancé par le SwingUtilities.invokeLater mais juste les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.table.scrollRectToVisible(rec);

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    J'ai mis ca code à la fin du run du thread principal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Runnable code = new Runnable() {
    			public void run() {
    				c.table.scrollRectToVisible(rec);
    			}
    		}; //fin Runnable
     
     
     
    		if (SwingUtilities.isEventDispatchThread()) {
    			    code.run();
    			  } else {
    			    SwingUtilities.invokeLater(code);
    			  }
    et j'ai retirer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.table.scrollRectToVisible(rec);
    du run principal.
    Le tableau ne plante plus , mais il ne suit plus automatiquement le défilement.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    318
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 318
    Par défaut
    Un oubli ede parenthèse , c'est bon ca fonctionne.

  16. #16
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    arsenik, tu pourrais poster le code que tu utilises finalement?

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2006, 10h07
  2. Défilement automatique JTable dans JscrollPane
    Par jdewalqu dans le forum Composants
    Réponses: 3
    Dernier message: 24/08/2006, 18h28
  3. Défilement automatique d'un StringGrid
    Par ero-sennin dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/06/2006, 01h53
  4. [Stratégie] Défilement automatique de texte
    Par speedster dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 18/07/2005, 15h56
  5. [BCB5] Défilement automatique des scroll bars
    Par Christophe Brun dans le forum C++Builder
    Réponses: 2
    Dernier message: 05/12/2004, 17h59

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