将JScrollPane滚动到右侧SWING

时间:2016-05-31 22:13:33

标签: java swing jscrollpane jscrollbar

我正在使用JscrollPane添加元素,当我有超过7时,我的JScrollPane中的JScrollBar被激活。我需要在引入新元素时,滚动条移动到右侧

    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:问题是当我向右移动时,滚动没有更新,所以当我设置值时,最大值不是最终的最大值。

此JPanel位于另一个具有其他组件布局的JPanel中。

所以:在这个JPanel中我有一个带有JPanel的JScrollBarPane,它包含我在运行时添加的组件。这个JPanel在另一个JPanel中。当我更新滚动条位置时,最大位置不等于此迭代的最终最大位置。

JScrollPane会影响窗口的大小

我希望这是足够的信息。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

您必须在所有组件调整大小和重新验证后(例如,在摆动完成当前更新周期后)更改滚动位置。那是代码工作正常:

SwingUtilities.invokeLater(() -> {
  scrollPane.getHorizontalScrollBar().setValue(scrollPane.getHorizontalScrollBar().getMaximum());
});