2016-05-31 170 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的doenst影響到窗口

我希望這是足夠的信息的大小。

回答

2

即使將新組件添加到我的滾動窗格中,我也無法重現您的問題。

使用此代碼我得到一個完美的右對齊的滾動條:

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

沒有更多的代碼是很難猜測什麼是你的情況發生。你的jPanel是外窗戶嗎?如果調整滾動窗格的大小會影響窗口的大小,那麼在使用repaint()之前,可能需要在窗口上調用pack()(jPanel/jFrame)。

如果仍然卡住,那麼將代碼分解爲Minimal, Complete, and Verifiable example,然後自行運行,並且應該能夠看到是什麼導致了問題。

編輯

作爲測試嘗試按以下順序代碼,並重新驗證滾動面板和它裏面的面板,而不是父母的JPanel:

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

我看到這個問題,但我不知道我該如何解決它。問題是,當我做scroll.setValue(),滾動條不更新。如果在我的主代碼中強制它移動到右側,它可以工作,但在我的Panel代碼中,不工作。我編輯信息以獲取更多信息 – Transy

+0

@Transy查看我的編輯。您需要調整代碼的順序並更改要重新驗證的內容。 – sorifiend