JScrollPane не реагирует из-за изменения размера JPanel

У меня есть JPanel для разметки карт, внутри которого находится JScrollPane, внутри которого находится JPanel для разметки пружин. Springanout JPanel динамически добавляется с JPanels сверху вниз, но когда JButtons выходят за пределы JPanel, JScrollPane не приспосабливается к дополнительному контенту. Кроме того, по-видимому, высота JPanel Springlayout остается 0, несмотря на добавленное содержание. Установка свойства изменяемого размера true тоже ничего не делает.

Вот фрагмент кода. Я опустил карту JPanel и код переключения карты.

    SpringLayout mainlayout = new SpringLayout();
    JPanel maincard = new JPanel(mainlayout); // springlayout JPanel
    for (int i = 0; i < info.size(); i++) {
        GridLayout entryLayout = new GridLayout(1, 1);
        JPanel entry = new JPanel(entryLayout);
        entry.setSize(800, 30);

        JButton name = new JButton();
        name.setSize(250, 30);
        name.setText(info.get(i).name);

        entry.add(name);

        mainlayout.putConstraint(SpringLayout.NORTH, entry,
                 i * 100 + 5,
                 SpringLayout.NORTH, maincard); // moves JPanel lower and lower
        maincard.add(entry);
    }
    maincard.setSize(width, 30 * (info.size() + 1));
    maincard.revalidate();
    JScrollPane scroll = new JScrollPane(maincard);
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    scroll.setSize(200, 200); // this and setPreferredSize don't affect
    cardpanel.add(scroll, cardName);
    cardpanel.setSize(20, 200); // no effect

1 ответ

Решение

У меня были некоторые проблемы с этим сам. То, что работало для меня, использовало пограничный переход. И вам нужно вызвать revalidate после добавления нового элемента, чтобы обновить панель прокрутки.

Вот пример кода, который я использовал в своем проекте некоторое время назад:

public BookingTable()
{
    super(new BorderLayout());
    _contentPanel = new JPanel();
    _contentPanel.setLayout(new BoxLayout(_contentPanel, BoxLayout.Y_AXIS));
    _scrollPane = new JScrollPane(_contentPanel);

    add(_scrollPane, BorderLayout.CENTER);
}

private void addToPanel(EntryView panel)
{
    panel.setPreferredSize(new Dimension(150, 35));
    panel.setMaximumSize(new Dimension(160, 45));
    panel.setMinimumSize((new Dimension(80, 30)));   

    _contentPanel.add(panel);
    _contentPanel.revalidate();
}

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

Другие вопросы по тегам