2016-05-31 7 views
1

Ich verwende JscrollPane, das ich Elemente hinzufüge und wenn ich mehr als 7 habe, ist die JScrollBar in meinem JScrollPane aktiviert. Ich brauche, dass, wenn ich ein neues Element einzuführen, wird die Bildlaufleiste nach rechts bewegtBewege JScrollPane scrolle nach rechts 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(); 

} 

CONSTRUCTOR:

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)); 

Die Bildlaufleiste nach rechts bewegt wird, aber nie das Maximum erreichen, immer ein wenig mehr Abstand zum Scrollen.

Wer weiß, warum das auftritt? Ich habe gesehen, dass mit setValue und getMaximum die Bildlaufleiste nach rechts bewegt wird, aber für mich bleibt es in der Nähe der rechten, aber nicht der rechten Seite.

Danke für Ihre Zeit.

Hier ist ein Screenshot, um es zu sehen.

enter image description here

EDIT: Die Klasse, die diesen Code enthält, ist ein JPanel

EDIT2: Das Problem ist, dass, wenn ich richtig bewegen, wird die Schriftrolle nicht aktualisiert, so dass die maximun wenn ich setValue, ist nicht das letzte Maximum.

Dieses JPanel befindet sich in einem anderen JPanel, das ein Layout mit anderen Komponenten hat.

Also: in diesem JPanel habe ich eine JScrollBarPane mit einem JPanel, die die Komponenten haben, die ich zur Laufzeit hinzufüge. Dieses JPanel befindet sich in einem anderen JPanel. Wenn ich die Scrollbar-Position aktualisiere, ist die maximale Position nicht gleich der endgültigen maximalen Position dieser Iteration.

Die JScrollPane doenst auf die Größe des Fensters beeinflussen

Ich hoffe, das genug Informationen ist.

Antwort

2

Ich kann das Problem nicht reproduzieren, auch wenn ich neue Komponenten zu meinem Bildlauffenster hinzufüge.

diesen Code verwenden ich eine vollkommen richtig ausgerichtet Bildlaufleiste erhalten:

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

Ohne mehr Code, um es schwer zu erraten ist, was in Ihrem Fall geschieht. Ist Ihr jPanel das äußere Fenster? Wenn die Größenänderung Ihres Bildlauffensters die Größe Ihres Fensters beeinflussen könnte, müssen Sie möglicherweise pack() in Ihrem Fenster (jPanel/jFrame) aufrufen, bevor Sie repaint() verwenden.

Wenn Sie immer noch stecken stecken Sie Ihren Code in eine Minimal, Complete, and Verifiable example und dann führen Sie es für sich selbst, und Sie sollten in der Lage sein zu sehen, was das Problem verursacht.

bearbeiten:

Als Test Code in dieser Reihenfolge versuchen, und die Scroll-Scheibe und die Platte im Innern statt der Mutter JPanel revalidate:

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

ich das Problem sehen, aber ich weiß nicht wie ich es beheben kann. Das Problem ist, dass wenn ich scroll.setValue(), Scrollbar nicht aktualisiert wird. Wenn ich es in meinem Hauptcode zwinge, nach rechts zu gehen, funktioniert es, aber in meinem Panel Code funktioniert es nicht.Ich bearbeite die Nachricht für weitere Informationen – Transy

+0

@Transy Siehe meine Bearbeitung. Sie müssen die Reihenfolge Ihres Codes anpassen und ändern, was Sie erneut validieren. – sorifiend

Verwandte Themen