2016-05-31 11 views
1

요소를 추가하는 JscrollPane을 사용하고 있고 7 개 이상일 때 JScrollPane 내의 JScrollBar가 활성화됩니다. 나는 새로운 요소를 도입 할 때, 스크롤 막대를 오른쪽으로 이동하는 것이 필요JScrollPane 스크롤을 오른쪽으로 이동 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(); 

} 

생성자 :

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

스크롤 막대를 오른쪽으로 이동하지만 결코 항상이 최대에 도달 스크롤 할 거리가 조금 더 있습니다.

왜 이런 일이 발생하는지 알고 계십니까? setValue 및 getMaximum을 사용하면 스크롤바가 오른쪽으로 이동하는 것을 보았지만 나에게는 오른쪽 근처에 머물러 있지만 옳지는 않습니다.

감사합니다.

다음은 그것을 보는 스크린 샷입니다.

enter image description here

편집 : 그 코드가 포함 된 클래스는 JPanel의입니다

EDIT2 : 문제는 내가 오른쪽으로 이동하면 스크롤이 업데이트되지 않는 것입니다, 그래서 setValue의 항목 최대가 아니다 최종 maximun.

이 JPanel은 다른 구성 요소가있는 레이아웃이있는 다른 JPanel 안에 있습니다.

그래서이 JPanel에는 런타임에 추가하는 구성 요소가있는 JPanel이있는 JScrollBarPane이 있습니다. 이 JPanel은 다른 JPanel 내부에 있습니다. 스크롤 막대 위치를 업데이트 할 때 최대 위치가이 반복의 최종 최대 위치와 같지 않습니다.

JScrollPane의 창 I이 충분한 정보를 희망

의 크기에 영향을 doenst.

답변

2

스크롤 창에 새 구성 요소를 추가 할 때도 문제가 재현되지 않습니다. 귀하의 경우에는 무슨 일이 일어나고 있는지 짐작하기가 어렵 더 많은 코드없이

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

: 내가 완벽하게 잘 정렬 된 스크롤 막대를 얻을이 코드를 사용하여

. jPanel이 바깥 창입니까? 스크롤 창 크기를 조정하면 창의 크기에 영향을 줄 수 있으므로 repaint()를 사용하기 전에 창 (jPanel/jFrame)에서 pack()을 호출해야 할 수 있습니다.

여전히 멈췄다면 코드를 Minimal, Complete, and Verifiable example으로 나눈 다음 직접 실행하면 문제를 일으키는 원인을 볼 수 있습니다.

편집 : 테스트로

순서로 코드를 시도하고 스크롤 창 오히려 부모 JPanel의 그것보다 내부의 패널 재 검증 :

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

내가 문제를 참조하지만 내가 어떻게 고칠 수 있는지 모르겠다. 문제는 scroll.setValue() 할 때 스크롤 막대가 업데이트되지 않습니다. 내 주 코드에서 강제로 오른쪽으로 이동하면 작동하지만 패널 코드에서는 작동하지 않습니다.더 많은 정보를 위해 메시지를 편집하십시오 – Transy

+0

@ 전송 내 편집을 참조하십시오. 코드 순서를 조정하고 재 검증 대상을 변경해야합니다. – sorifiend