2016-05-31 6 views
1

JScrollPaneを使用して要素を追加しています.7を超えると、JScrollPane内のJScrollBarがアクティブになります。私は新しい要素を導入したときに、スクロールバーを右に移動されていることを必要とするJScrollPaneを右にスクロールする

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

スクロールバーを右に移動させたが、決して常に持って、最大に達しますスクロールするにはもう少しの距離。

これがなぜ発生するのですか? setValueとgetMaximumを使用するとスクロールバーが右に移動することがわかりましたが、私にとっては右に近いが右にはありません。

お時間をいただきありがとうございます。

ここにそれを表示するスクリーンショットがあります。

enter image description here

EDIT:そのコードを含むクラスはJPanelのです

EDIT2:問題は、私は右に移動すると、スクロールが更新されないということですので、私はsetValueのmaximunのではなく、最終的なmaximun。

このJPanelは、他のコンポーネントとのレイアウトを持つ別のJPanelの内部にあります。

So:このJPanelには、実行時に追加するコンポーネントを持つJPanelを持つJScrollBarPaneがあります。このJPanelは別のJPanelの内部にあります。スクロールバーの位置を更新すると、最大位置はこの繰り返しの最後の最大位置と等しくなりません。

JScrollPaneには、私は、これは十分に情報であると思い窓

の大きさに影響を与える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()を実行すると、スクロールバーが更新されないということです。私の主なコードでは、右に動かすように強制すると動作しますが、私のPanelコードでは動作しません。私は詳細情報のメッセージを編集します – Transy

+0

@翻訳私の編集を参照してください。コードの順序を調整し、再検証する内容を変更する必要があります。 – sorifiend

関連する問題