【问题标题】:Making scrollRectToVisible work with a panel laid out with GroupLayout使用 GroupLayout 布局的面板使 scrollRectToVisible 工作
【发布时间】:2014-04-17 21:43:22
【问题描述】:

一个相当简单的例子:这在JPanel 中布置了JLabel,将JPanel 填充到JScrollPane 中,并将其粘贴在JFrame 中。然后我想要窗格滚动以使JLabel 可见,但它没有这样做。我试过在标签和面板上调用scrollRectToVisible,没有运气,弄乱了视口,没有运气,尝试手动设置滚动条值,没有运气。显然我在做一些愚蠢的事情,但我看不出是什么。

import java.awt.Dimension;
import java.awt.Rectangle;

import javax.swing.*;

public class SillyTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JPanel panel = new JPanel();
                GroupLayout layout = new GroupLayout(panel);
                panel.setLayout(layout);
                GroupLayout.SequentialGroup seq = layout
                        .createSequentialGroup();
                GroupLayout.ParallelGroup par = layout.createParallelGroup();
                JLabel fish = new JLabel("fish");
                seq.addGap(3000);
                seq.addComponent(fish);
                par.addComponent(fish);
                par.addGap(200);
                layout.setHorizontalGroup(par);
                layout.setVerticalGroup(seq);
                JScrollPane scrollPane = new JScrollPane(panel);
                JFrame frame = new JFrame("whatever this is about");
                frame.add(scrollPane);
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
                fish.scrollRectToVisible(fish.getBounds());
            }
        });
    }
}

【问题讨论】:

    标签: java swing scroll jscrollpane


    【解决方案1】:

    在 Windows7 上使用 JDK7 的代码对我来说可以正常工作。

    如果您在其他版本上遇到问题,那么您可以尝试:

    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            fish.scrollRectToVisible(fish.getBounds());
        }
    });
    

    这只是确保 scrollRectToVisible() 被添加到 EDT 的末尾,因此应该在所有显示帧的初始逻辑都发生后处理它。

    【讨论】:

    • 在我在问题中给出的代码中,everything 在 EDT 中运行,所以我看不出这可能是什么问题。添加一个单独的Runnable 来进行滚动似乎要复杂得多,因为fish 必须以某种方式从第一个传递到第二个。
    • @dfeuer,我知道代码正在 EDT 上执行。但有些方法还调用 SwingUtilities.invokeLater() 将代码放在 EDT 的末尾,这意味着您的 scrollRectToVisible() 实际上可能在它应该执行之前执行。使用 invokeLater() 是一种常见的技术,可确保您的代码位于 EDT 的末尾。正如我已经说过的,代码对我来说很好。
    • 我尝试了您的建议,但它仍然无法向下滚动以使鱼可见。我似乎不太可能偶然发现 openjdk 中的错误,但我想一切皆有可能。
    • 不,这似乎不是 openjdk 错误。我切换到 Sun,它仍然在做同样的事情。
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多