我正在使用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的JScrollBarPane,它包含我在运行时添加的组件。这个JPanel在另一个JPanel中。当我更新滚动条位置时,最大位置不等于此迭代的最终最大位置。
JScrollPane会影响窗口的大小
我希望这是足够的信息。
答案 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());
});