Прокрутка JComponent в JScrollPane

Скажем, у меня большой JComponent:

Dimension componentSize = new Dimension(5000,5000);

И JScrollPane меньшего размера:

Dimension scrollPaneSize = new Dimension(500,500);

Я хочу отобразить часть моего JComponent в JScrollPane, как на картинке ниже:

JComponent внутри JScrollPane

Белый прямоугольник - это моя панель JScrollPane, которая в настоящее время отображает часть JComponent от (x1, y1) до (x2, y2).


Итак, что я пробовал:

Я создал новый JComponent:

JComponent component = new JComponent(){
    protected void paintComponent(Graphics g)
    {
        // Here I draw a background
    } 
};

И поместил его как представление области просмотра в JScrollPane:

JScrollPane scrollPane = new JScrollPane();

scrollPane.setViewportView(component);

Затем я прикрепил JScrollPane к JFrame:

JFrame frame = new JFrame();

frame.setLayout(new BorderLayout());

frame.add(scrollPane, BorderLayout.CENTER);

frame.pack();
frame.setVisible(true);

И я пытаюсь изменить видимую область с помощью:

scrollpane.getViewport().setBounds(x1,y1,500,500)

Что случилось?


person Edward Ruchevits    schedule 14.03.2013    source источник


Ответы (2)


setBounds используется для определения местоположения и размера компонента в его родительском контейнере. Это не то, что вы хотите делать. Если вы не используете абсолютный макет, вам никогда не следует использовать этот метод.

Вместо этого попробуйте

component.scrollRectToVisible(new Rectangle(x1, y1, 500, 500));

Вместо...

Ознакомьтесь с JComponent#scrollRectToVisible

person MadProgrammer    schedule 14.03.2013
comment
Спасибо Клеопатре, если увидишь ее, она научила меня этому действительно красивому и простому решению: D - person MadProgrammer; 14.03.2013

Этот код всегда будет вызывать прокрутку области просмотра независимо от размера области просмотра.

scrollPane.getViewport().setViewPosition( new Point(x1, y1) );
person camickr    schedule 14.03.2013