2016-05-31 2 views
1

Я использую JscrollPane, чтобы добавить элементы, а когда у меня больше 7, JScrollBar внутри моей JScrollPane активирован. Мне нужно, что когда я ввожу новый элемент, полоса прокрутки перемещается вправоПереместить 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

EDIT: Класс, который содержит этот код является JPanel

EDIT2: Проблема заключается в том, что, когда я двигаться вправо, свиток не обновляется, поэтому Maximun когда я SetValue, не является окончательный максим.

Этот JPanel находится внутри другого JPanel, который имеет компоновку с другими компонентами.

Итак: в этом JPanel у меня есть JScrollBarPane с JPanel, у которого есть компоненты, которые я добавляю во время выполнения. Этот JPanel находится внутри другого JPanel. Когда я обновляю позицию полосы прокрутки, то максимальная позиция не равна конечной максимальной позиции этой итерации.

JScrollPane doenst влияет на размер окна

Я надеюсь, что это достаточно информации.

ответ

2

Я не могу воспроизвести вашу проблему даже при добавлении новых компонентов в панель прокрутки.

Используя этот код я получить совершенно правильно выровненную полосу прокрутки:

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

Без больше коды, трудно догадаться, что происходит в вашем случае. Является ли ваше jPanel внешним окном? Если изменение размера панели прокрутки может повлиять на размер вашего окна, вам может потребоваться вызвать пакет() в вашем окне (jPanel/jFrame), прежде чем использовать функцию repaint().

Если вы все еще застряли, переведите код в Minimal, Complete, and Verifiable example, а затем запустите его самостоятельно, и вы сможете увидеть, что вызывает проблему.

Edit:

В качестве теста попробуйте свой код в таком порядке, и перепроверить панель прокрутки и панель внутри него, а не родительское JPanel:

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

я вижу проблему, но я Не знаю, как это исправить. Проблема в том, что когда я выполняю scroll.setValue(), полоса прокрутки не обновляется. Если в моем основном коде я заставляю его двигаться вправо, он работает, но в моем Панельном коде не работает.Я редактирую сообщение для получения дополнительной информации – Transy

+0

@Transy См. Мое редактирование. Вам нужно будет отрегулировать порядок вашего кода и изменить то, что вы повторно проверяете. – sorifiend

Смежные вопросы