当前位置: 首页 > 知识库问答 >
问题:

将JScrollPane滚动向右移动

刁远
2023-03-14

我正在使用添加元素的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:问题是当我向右移动时,滚动没有更新,所以当我设置值时的maximun不是最终的maximun。

共有1个答案

高弘光
2023-03-14

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

SwingUtilities.invokeLater(() -> {
  scrollPane.getHorizontalScrollBar().setValue(scrollPane.getHorizontalScrollBar().getMaximum());
});
 类似资料:
  • 问题内容: 我需要在JScrollPane中内容的 左侧 放置一个滚动条。是否可以在没有单独的JScrollBar组件的情况下完成?也许只是通过设置一些对齐方式? 问题答案: 通过反复试验,我发现 像魅力一样运作。

  • 问题内容: 我需要将JScrollPane滚动到底部。JScrollPane包含一个JPanel,其中包含许多JLabel。 要滚动到顶部,我只需要: 但是如何精确滚动到最底端?(太远了,它抖动) 问题答案:

  • 我有一个类可以画一些非常简单的图形,比如直线、圆和矩形。线条可以动态扩展,有时当它们扩展到超出分辨率时,如果没有滚动条,就无法看到。因此,我已经将JScrollPane添加到JFrame中,但不幸的是,尽管已经调用了布局管理器,但滚动条还是无法滚动。 这是我所拥有的:-一个绘制组件(线条、矩形、圆形)的类-一个设置JFrame/JScrollPane的类 这是我的GUI类的摘录代码: 通过上面的代

  • 当我将JTextPane添加到SOUTH位置时,滚动窗格会滚动以显示文本。我不希望滚动窗格从其最上面的位置移动。我怎样才能防止这种情况?

  • 问题内容: 每次(第一次除外),我在JEditorPane中设置的文本滚动条都会跳到JEditorPane的底部。有什么办法可以避免这种情况?我尝试的一种方法是在setText()之后使用setCaretPosition(0)。它可以工作,但这并不是我真正需要的。滚动条向下跳然后向上跳。有没有一种方法可以避免settext()上滚动条的任何移动? 我的代码: 问题答案: 有不同的方法可以做到这一点

  • 问题内容: 我有下一个代码: 自动向下滚动。但是,如果我尝试向上滚动以重新阅读消息,则会强制向下滚动。我怎样才能解决这个问题? 问题答案: 添加新邮件时,使用尺寸与邮件窗格的首选大小相同的进行调用。给定垂直取向,它可方便地使的优选尺寸的邮件面板的高度的整数倍。另请参阅: 如何使用滚动窗格 。 附录:有关 文本区域滚动的 引人入胜的讨论也可能会有所帮助。