gpt4 book ai didi

java - 将 JScrollPane 滚动条移至右侧 SWING

转载 作者:行者123 更新时间:2023-11-30 02:54:52 25 4
gpt4 key购买 nike

我使用 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:问题是当我向右移动时,滚动不会更新,因此我 setValue 时的最大值不是最终的最大值。

此 JPanel 位于另一个 JPanel 内部,该 JPanel 具有包含其他组件的布局。

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

JScrollPane 不影响窗口的大小

我希望这是足够的信息。

最佳答案

在所有组件调整大小并重新验证后(例如,在 swing 完成当前更新周期后),您必须更改滚动位置。该代码运行良好:

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

关于java - 将 JScrollPane 滚动条移至右侧 SWING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37556496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com