【问题标题】:Making a JList scroll to the end of it's elements使 JList 滚动到其元素的末尾
【发布时间】:2012-04-10 15:15:57
【问题描述】:

我正在使用以下代码滚动到 JList 的末尾。我在包含 JList 的窗口上 setVisible 以及向 JList 添加项目时使用它。

int lastIndex = getMyList().getModel().getSize() - 1;

if (lastIndex >= 0) {
    getMyList().ensureIndexIsVisible(lastIndex);
}

问题在于,在第一次调用 setVisible 时,JList 会无缘无故地向上滚动几个项目。如果我随后调用 setVisible(false),然后调用 setVisible(true),则 JList 会像预期的那样滚动到底部。我注意到的一件事是,当我打开一个窗口的那一刻,它的一些组件似乎会在几分之一秒内重新排列。所以我猜测问题可能归结于此。

因此,当我打开其中一个窗口时,我按下了“打印屏幕”,您可以看到,当窗口最初打开时,它底部的组件甚至不可见(表情符号和按钮)。这是窗户“完全打开”时的样子,以及它在完全打开之前的几分之一秒的样子。

窗口打开后的样子(可以看到滚动条不在底部)

当我在调用 setVisible() 后打开窗口时截屏时窗口的外观

所以有人知道为什么当窗口打开时布局会发生变化,以及如何让我的 JList 在第一次打开时滚动到底部?

【问题讨论】:

    标签: java swing jlist


    【解决方案1】:

    尝试将ensureIndexIsVisible() 呼叫封装在SwingUtilities.invokeLater()

    【讨论】:

    • @csss 为我工作,不知道,用SSCCE +1 编辑你的问题
    • 嗯,我已将范围缩小到在列表中的 jlabels 中使用 html。如果中心的文本跨越多行,则会导致滚动混乱。不过不知道怎么解决。
    • @csss 只是重复:a)您是否尝试稍后调用? (问题不是 EDT,而是最后在EDT)b)SSCCE在哪里,所以我们可以尝试重现问题?
    • @kleopatra 是的,我尝试了 invokeLater。实际上,我之前实际上在想,您将是唯一能够弄清楚这一点的人之一,因为您似乎比任何人都更了解挥杆。我认为制作一个好的 SSCCE 会很困难,但我已经将问题缩小到它的根源,所以我现在可以发布一个合适的 SSCCE。但是在这个阶段我已经连续编码了 16 个小时,所以我必须先睡一会儿。 :-)
    • @kleopatra 好吧,我正在写出 SSCCE,我开始针对 SSCCE 代码测试我现有的代码,并将问题缩小到实际的窗口 JFrame。事实证明,如果您在 Netbeans Properites/Code 中选择“生成调整大小代码”(我使用它来使窗口居中),然后勾选“生成大小”,则在 JList 单元格中使用 HTML 时会导致滚动条混乱。取消勾选“生成大小”可以解决问题......花了很多时间才找到这个问题的根源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多