2016-05-31 1 views
1

J'utilise JscrollPane que j'ajoute des éléments et quand j'en ai plus de 7, le JScrollBar à l'intérieur de mon JScrollPane est activé. J'ai besoin que lorsque je présente un nouvel élément, la barre de défilement est déplacée vers la droiteDéplacer JScrollPane défiler vers la droite SWING

public void addElement(String nombre, Wheel wheel) 
{ 
    if(actual != null) 
    { 
     actual.bordeOn(false); 
    } 
    if(this.actual != null && this.index != 0 && this.index != this.actual.getIndex()+1) 
    {//Se ha producido navegacion en medio de la pila 
     for(int i = this.stack.size()-1 ; i > this.actual.getIndex(); i--) 
     {//Borramos todos los elementos del actual en adelante. 
      BreadCrump b = this.stack.get(i); 
      this.panelBCD.remove(b); 
      this.stack.remove(i); 
     } 
     this.index = this.actual.getIndex()+1; 


    } 
    BreadCrump bc = new BreadCrump(nombre, this); 
    bc.setIndex(this.index); 
    this.index++; 
    this.stack.add(bc); 
    panelBCD.add(bc);  
    actual = bc; 
    bc.setWheel(wheel); 
    bc.bordeOn(true); 
    numberElements++; 
    JScrollBar scroll = sp.getHorizontalScrollBar(); 
    scroll.setValue(scroll.getMaximum()); 
    this.revalidate(); 
    this.repaint(); 

} 

CONSTRUCTEUR:

public Displayer(JPanel father) 
panelBCD = new JPanel(); 
    this.setBackground(new java.awt.Color(200, 200, 200)); 
    this.setPreferredSize(new java.awt.Dimension(father.getSize().width, height)); 
    BoxLayout aaa = new BoxLayout(this,1); 
    this.setLayout(aaa); 
    FlowLayout mg = new FlowLayout(0,80,0); //Este es la separacion entre elementos 
    //a.setLayout(null); 
    panelBCD.setLayout(mg); 
    mg.setAlignment(FlowLayout.LEFT); 
    sp = new JScrollPane(panelBCD); 
    sp.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); 
    sp.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    //sp.setBounds(0, 0,father.getSize().width, height); 

    this.add(sp); 
    father.add(this, java.awt.BorderLayout.PAGE_END); 
    addMouseListener(this); 
addMouseMotionListener(this); 
    sp.setViewportBorder(new LineBorder(Color.BLACK)); 

La barre de défilement est déplacée vers la droite, mais jamais atteindre le maximum, ont toujours un peu plus de distance pour faire défiler.

Quelqu'un sait pourquoi cela se produit? J'ai vu que l'utilisation de setValue et getMaximum déplace la barre de défilement vers la droite, mais pour moi, elle reste près de la droite mais pas juste.

Merci pour votre temps.

Voici une capture d'écran pour le voir.

enter image description here

EDIT: La classe qui contient ce code est un JPanel

EDIT2: Le problème est que quand je me déplace à droite, le défilement est pas mis à jour, de sorte que le maximun quand je setvalue, n'est pas le maximun final.

Ce JPanel est dans un autre JPanel qui a une disposition avec d'autres composants. Donc: dans ce JPanel j'ai un JScrollBarPane avec un JPanel qui a les composants que j'ajoute dans l'exécution. Ce JPanel est dans un autre JPanel. Lorsque je mets à jour la position de la barre de défilement, la position maximun n'est pas égale à la position maximun finale de cette itération.

Le JScrollPane doenst affecte à la taille de la fenêtre

J'espère que cela est assez d'informations.

Répondre

2

Je ne peux pas reproduire votre problème même lorsque vous ajoutez de nouveaux composants à mon volet de défilement.

En utilisant ce code que je reçois une barre de défilement parfaitement aligné à droite:

JScrollBar scroll = sp.getHorizontalScrollBar(); 
scroll.setValue(scroll.getMaximum()); 

Sans plus de code, il est difficile de deviner ce qui se passe dans votre cas. Votre jPanel est-il la fenêtre extérieure? Si le redimensionnement de votre volet de défilement peut affecter la taille de votre fenêtre, vous devrez peut-être appeler pack() sur votre fenêtre (jPanel/jFrame) avant d'utiliser repaint().

Si vous êtes toujours bloqué, divisez votre code en code Minimal, Complete, and Verifiable example, puis exécutez-le par vous-même, et vous devriez être capable de voir ce qui cause le problème.

Modifier:

Comme un test essayer votre code dans cet ordre, et revalider le volet de défilement et le panneau à l'intérieur plutôt que les DPanel parents:

numberElements++; 
panelBCD.revalidate(); 
sp.revalidate(); 
JScrollBar scroll = sp.getHorizontalScrollBar(); 
scroll.setValue(scroll.getMaximum()); 
this.repaint(); 
+0

Je vois le problème, mais je Je ne sais pas comment je peux le réparer. Le problème est que lorsque je fais scroll.setValue(), la barre de défilement n'est pas mise à jour. Si dans mon code principal, je le force à se déplacer vers la droite, cela fonctionne, mais dans mon code de panneau, ne fonctionne pas.Je modifie le message pour plus d'infos – Transy

+0

@Transy Voir mes modifications. Vous devrez ajuster l'ordre de votre code et changer ce que vous validez de nouveau. – sorifiend