Полоса прокрутки не отображается в JPanel

Я создал графический интерфейс на Java, который выглядит так, как показано ниже:

«panel_mid» — белая панель посередине. Я добавил его в панель прокрутки под названием «panel_mid_scrollpane».

Помимо 'panel_mid' есть еще панели -

  • panel_left (содержит кнопку «назад»)
  • panel_right (виден справа)

введите здесь описание изображения

Релевантный код для этого графического интерфейса -

    panel_mid.setBorder(grayborder);
    panel_mid.setBounds(0, 0, 1100, 1060);
    panel_mid.setBackground(Color.white);
    panel_mid.add(obj.create_test_add_section);

    panel_mid_scrollpane = new JScrollPane(panel_mid);
    panel_mid_scrollpane.setLocation(150, 20);
    panel_mid_scrollpane.setSize(1000, 660);
    panel_mid_scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

Кнопка Добавить раздел, показанная на панели panel_mid, добавляет раздел на среднюю панель при каждом нажатии. Когда эта кнопка нажимается несколько раз, графический интерфейс выглядит так:

введите здесь описание изображения

Как видите, полоса прокрутки не появляется автоматически при добавлении панелей, поэтому последняя панель видна только наполовину. Что может быть причиной этой проблемы?

Спасибо !


person Ankit Rustagi    schedule 24.05.2013    source источник


Ответы (2)


Полосы прокрутки появляются автоматически, когда предпочтительный размер компонента, добавляемого в область прокрутки, превышает размер области прокрутки.

Похоже, вы используете нулевой макет.

//panel_mid.setBounds(0, 0, 1100, 1060);
panel_mid.setBackground(Color.white);
panel_mid.add(obj.create_test_add_section);

panel_mid_scrollpane = new JScrollPane(panel_mid);
//panel_mid_scrollpane.setLocation(150, 20);
//panel_mid_scrollpane.setSize(1000, 660);

Не используйте нулевой макет с setSize() и setLocation. Swing был разработан для использования с менеджерами компоновки. Если вы используете менеджеры компоновки, полоса прокрутки будет работать автоматически, а размер и расположение будут рассчитаны автоматически.

Прочтите руководство по Swing в менеджерах макетов.

person camickr    schedule 24.05.2013
comment
Но как тогда установить ширину/высоту панелей? Новые элементы при добавлении теперь занимают все доступное пространство, я хочу, чтобы они каждый раз занимали фиксированное пространство. Спасибо - person Ankit Rustagi; 24.05.2013
comment
Используйте различные менеджеры макетов для достижения желаемого макета. Я дал вам ссылку на учебник, который объясняет основы. Если вы создаете пользовательский компонент и выполняете пользовательское рисование, вам необходимо переопределить метод getPreferredSize(), чтобы он возвращал соответствующее значение. Если вы просто используете существующие компоненты Swing, вам не нужно ничего делать, Swing сам определит предпочтительный размер. - person camickr; 24.05.2013

Вы должны указать графическому интерфейсу обновиться, чтобы контейнеры снова были размещены. Это покажет контейнеру, что он также должен отображать полосу прокрутки.

Итак, в ActionListener или что-то еще, что вы используете для добавления раздела, добавьте код, например:

     container_with_sections.validate();
     container_with_sections.repaint();

где container_with_sections — это контейнер (JContainer), содержащий JScrollPane, или контейнер, содержащий контейнер, содержащий JScrollPane, и так далее.

person xtraclass    schedule 24.05.2013
comment
«контейнер (JContainer), содержащий JScrollPane, или контейнер, содержащий контейнер, содержащий JScrollPane», другими словами, родитель JScrollPane. - person afsantos; 24.05.2013