【问题标题】:Scrolling to the top JPanel inside a JScrollPane滚动到 JScrollPane 内的顶部 JPanel
【发布时间】:2013-10-16 09:52:44
【问题描述】:

我知道很多人问过这个问题,但我仍然无法解决这个问题。 我在 JScrollPane 中有一个 JPanel。 JPanel 包含六个动态加载的面板。 加载面板后,系统会垂直自动滚动到面板中间。 我必须避免这种情况,所以我尝试了这个:

panel.scrollRectToVisible(scrollPane.getBounds());

但它不起作用。 我的scrollPane就是这样创建的

JScrollPane scrollPane= new JScrollPane();
scrollPane.setBounds(panel.getBounds());
scrollPane.setViewportView(panel);

你能帮帮我吗?

【问题讨论】:

  • panel.scrollRectToVisible(new Rectangle(0,0,1,1)); ?
  • “我知道很多人都问过这个问题,” 我知道很多没有做过研究的人都是这样开始他们的信息的,暗示他们有。您在该主题上看到的前 3 个 SO 线程是什么?为什么他们没有回答之前多次提出的问题?
  • 粗鲁对你的帮助和懒惰一样少;-) 这两种态度都是-1。
  • 不相关:永远不要手动调整尺寸/定位组件(又名:调用 setBounds(...) )——这是合适的 LayoutManager 的专属任务

标签: java swing scroll jpanel jscrollpane


【解决方案1】:
  1. panel.scrollRectToVisible(scrollPane.getBounds()); 应该是panel.scrollRectToVisible(JPanelAddedOnRuntime.getBounds());

  2. 其余代码(此处发布)无法正常工作,

  3. 如需更好的帮助,请尽快发布SSCCE,简短、可运行、可编译

编辑

有效,您需要再次阅读我上面的第 3 条。点

import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class ScrollTesting {

    private JPanel panel = new JPanel();
    private JScrollPane scrollPane = new JScrollPane(panel);
    private Vector<JTextField> fieldsVector = new Vector<JTextField>();
    private Dimension preferredSize = new Dimension(400, 40);
    private Font font = new Font("Tahoma", 1, 28);

    public ScrollTesting() {
        panel.setLayout(new GridLayout(100, 1));
        for (int i = 0; i < 100; i++) {
            fieldsVector.addElement(new JTextField());
            fieldsVector.lastElement().setPreferredSize(preferredSize);
            fieldsVector.lastElement().setFont(font);
            panel.add(fieldsVector.lastElement());
        }
        JFrame frame = new JFrame();
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane);
        frame.setVisible(true);
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JTextField tf = (JTextField) fieldsVector.lastElement();
                panel.scrollRectToVisible(tf.getBounds());
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                ScrollTesting scrollTesting = new ScrollTesting();
            }
        });
    }
}

【讨论】:

  • 非常感谢。问题是我没有把代码 panel.scrollRectToVisible(pan0.getBounds());在 SwingUtilities.invokeLater 方法中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
相关资源
最近更新 更多