Полосы прокрутки JScrollPanes не отображаются

Итак, у меня есть макет сетки, в котором в каждой ячейке хранятся JScrollPane. Они также помещаются в массив для других целей. «Вид» расширяет «JPanel», поэтому это обычная панель с поддержкой изображений. Приложение запускается с ячейкой, заполненной прокруткой, содержащей представление, в котором еще нет изображения.

В этот момент я не вижу полосы прокрутки, но это не имеет значения, поскольку внутри JPanel ничего нет. Как только я открываю изображение и использую drawImage в paintComponenet JPanel, я не вижу появления полосы прокрутки. Вот как я создаю сетку и панель прокрутки

private void createContentPane() 
{
        GridLayout gridLay = new GridLayout(GRID_ROWS, GRID_COLUMNS);
        perspectiveTbl = new JScrollPane[NUM_PERSPECTIVE];
        mainPane = new JPanel();
        mainPane.setLayout(gridLay);

        int idx = 0;

        while(idx < perspectiveTbl.length)
        {
            perspectiveTbl[idx] = new JScrollPane(new View(modelImage));
            mainPane.add(perspectiveTbl[idx]);
            idx++;
        }

        this.getContentPane().add(mainPane, BorderLayout.CENTER);
}

Я не совсем уверен, почему полоса прокрутки не отображается, должны ли они быть установлены внутри панели для изображения?

Вот изображение приложения, как вы можете видеть, изображение обуви не получает полосу прокрутки, поэтому нет возможности просмотреть остальную часть изображения:

Изображение


person Patrick.SE    schedule 30.11.2011    source источник
comment
Вы уверены, что области прокрутки нужно прокручивать? Достаточно ли велик их контент?   -  person cdeszaq    schedule 30.11.2011
comment
Да, изображение большое, поэтому представление должно добавить scrollPane. У меня сложилось впечатление, что он не учитывает изображение внутри панели.   -  person Patrick.SE    schedule 01.12.2011


Ответы (2)


Вы можете либо пользователя не JPanel с изображением, а обычного JLabel с изображением

or

вызовите setPreferredSize(), чтобы панели отражали размер изображения.

person StanislavL    schedule 30.11.2011
comment
А для лучшего контроля рассмотрите возможность реализации Scrollable: docs.oracle. com/javase/6/docs/api/javax/swing/Scrollable.html - person Puce; 30.11.2011

Станислав, спасибо за подсказку, я действительно разобрался и заработал час назад, но вы указали правильный путь, чтобы исправить это с помощью атрибута preferenceSize. В итоге я повторно реализовал getPreferredSize с размером изображения внутри панели, добавил revalidate к событию рисования, чтобы полосы отображались сразу после загрузки изображения.

public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    g.drawImage(image, 0, 0, null);
    this.getViewScrollPane().revalidate();
}

public Dimension getPreferredSize() 
{
    if(image != null)
        return new Dimension(image.getWidth(),image.getHeight());
    else
        return super.getPreferredSize();
}
person Patrick.SE    schedule 01.12.2011