JScrollpane нужно уменьшить его ширину - PullRequest
9 голосов
/ 26 апреля 2010

У меня есть JScrollpane, внутри которого есть JPanel (а панель содержит несколько JLabel s).

Я хочу изменить размер панели прокрутки, чтобы фактически изменить ее размер (возможно, ниже предпочтительного размера внутренних компонентов), а не только размер области просмотра.

Цель состоит в том, чтобы внутренняя панель изящно исчезла (используя определенные приоритеты сжатия и т. П. В моем miglayout), когда пользователь сжимает область прокрутки слишком маленьким.

1 Ответ

14 голосов
/ 12 мая 2010

Вероятно, лучший способ состоит в том, чтобы содержащийся компонент всегда был той же ширины, что и область просмотра. Для этого первый содержащийся компонент (дочерний элемент к JViewPort, переданный в конструктор JScrollPane или установленный как viewportView) должен реализовать javax.swing.Scrollable. Ключевой метод - getScrollableTracksViewportWidth, который должен вернуть true.

Вот быстрая и грязная прокручиваемая JPanel:

public class ScrollablePanel extends JPanel implements Scrollable {
    public Dimension getPreferredScrollableViewportSize() {
        return getPreferredSize();
    }

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
       return 10;
    }

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
        return ((orientation == SwingConstants.VERTICAL) ? visibleRect.height : visibleRect.width) - 10;
    }

    public boolean getScrollableTracksViewportWidth() {
        return true;
    }

    public boolean getScrollableTracksViewportHeight() {
        return false;
    }
}
...