11

I have a JScrollpane that has a JPanel on the inside (and the panel contains some JLabels).

I want resizing the scroll pane to actually change its size (possibly below the preferred size of the inner components), not just the size of the viewport.

The goal is for the inner panel to gracefully disappear (using specific shrink priorities and the like in my miglayout) when the user shrinks the scrollpane too small.

Steven Sudit
  • 18,659
  • 1
  • 44
  • 49
Mike
  • 536
  • 1
  • 4
  • 10
  • The question is quite unclear to me, but you could perhaps monitor the size changes of the JScrollPane and react when it becomes lower than some bound (hide it smoothly). – Matthieu BROUILLARD Apr 28 '10 at 11:44
  • It seems that doing some silly relayout stuff when the size of the `JViewport` changes is about the only way to do it. (To clarify, I basically have a table inside of a scrollpane's viewport. I want the scrollpane to determine what rows of the table are shown, but I don't want it to affect what columns are shown. What I want to do is to assign a shrink priority for the different columns so that shrinking the horizontal size of the textbox will start to truncate specific columns.) – Mike Apr 28 '10 at 22:41

1 Answers1

16

Probably the best method is to have the contained component always be the same width as the viewport. To do this the first contained component (the one that is the child to JViewPort, passed into the JScrollPane constructor or set as the viewportView) needs to implement javax.swing.Scrollable. The key method is getScrollableTracksViewportWidth, which should return true.

Here's a quick and dirty scrollable 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;
    }
}
shemnon
  • 5,128
  • 4
  • 26
  • 36