更新JscrollBar而不重置位置

时间:2010-10-31 02:31:22

标签: java scrollbar validation

我有一个扩展JScrollPane的类,它的视口是另一个扩展JComponent并实现Scrollable的类。当组件的大小发生更改时,JscrollBars不会更新,除非我调用revalidate()但是这会将滚动条的位置重置为左上角。有没有办法在保持当前位置的同时更新滚动条的大小?

谢谢,Rob

1 个答案:

答案 0 :(得分:1)

问题是自定义滚动窗格还是自定义组件?我们无法猜测您可能做出了哪些改变。发布展示问题的SSCCE

对我来说很好。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ScrollSSCCE extends JPanel
{
    public ScrollSSCCE()
    {
        setLayout( new BorderLayout() );

        final JPanel panel = new JPanel();
        panel.setPreferredSize( new Dimension(200, 200) );
        JScrollPane scrollPane = new JScrollPane( panel );
        add( scrollPane );

        JButton button = new JButton("Adjust");
        add(button, BorderLayout.SOUTH);
        button.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                Dimension d = panel.getPreferredSize();
                d.width +=50;
                d.height +=50;
                panel.setPreferredSize(d);
                panel.revalidate();
            }
        });
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("ScrollSSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new ScrollSSCCE() );
        frame.setSize(150, 150);
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}