Java 移动JScrollPane滚动至右摆动

Java 移动JScrollPane滚动至右摆动,java,swing,jscrollpane,jscrollbar,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.inde

我正在使用添加元素的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会将滚动条向右移动,但对我来说,滚动条保持在右侧,而不是右侧

谢谢你抽出时间

这里有一个截图可以看到它

编辑:包含该代码的类是JPanel

EDIT2:问题是当我向右移动时,卷轴没有更新,因此设置值时的最大值不是最终的最大值

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

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

JScrollPane不会影响窗口的大小


我希望这是足够的信息。

即使将新组件添加到我的滚动窗格中,我也无法重现您的问题

使用此代码,我得到一个完全右对齐的滚动条:

JScrollBar scroll = sp.getHorizontalScrollBar();   
scroll.setValue(scroll.getMaximum());
如果没有更多的代码,很难猜测您的案例中发生了什么。你的jPanel是外窗吗?如果调整滚动窗格的大小可能会影响窗口的大小,则在使用repaint()之前,可能需要在窗口(jPanel/jFrame)上调用pack()

如果您仍然被卡住了,那么将代码分解为一个部分,然后自己运行它,您应该能够看到是什么导致了问题

编辑

作为测试,请按以下顺序尝试代码,并重新验证滚动窗格及其内部的面板,而不是父jPanel:

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

在所有组件调整大小并重新验证后(例如,在swing完成当前更新周期后),必须更改滚动条的位置。这就是代码的工作原理:

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

我看到了问题,但不知道如何解决。问题是当我滚动.setValue()时,滚动条没有更新。如果在我的主代码中,我强制它向右移动,它会工作,但在我的面板代码中,不工作。我编辑消息以了解更多信息info@Transy请参阅我的编辑。您需要调整代码的顺序,并更改正在验证的内容。