You're right.  I must have been thinking about something else 
(ScrollPane?).  Anyway, the problem here is that, to the best of my 
knowledge, neither AWT nor Swing has a layout manager that will readjust 
it's height given a fixed width or vice versa.

When you resize a JScrollPane, you resize its viewport, but the underlying 
JPanel component isn't affected.  So a solution to this problem would 
involve intercepting the viewport change and passing its new width on to 
the JPanel.  Unfortunately, as I said, you cannot simply set the width on a 
container with FlowLayout and have it recompute the height.  So what you 
end up doing is a hack: first, set the JPanel to the proper width (computed 
from the viewport's width) and let it recompute locations of it's children; 
2) find the location of the last child component and compute JPanel's 
proper height from that; 3) set the new dimension (I'm including sample code).

I think this is the simplest way of achieving what you want to do, but if 
you find a better one, I'd like to know.


Dmitry



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class test2 extends JPanel
{
    static JPanel pane;

    public static void main( String[] args )
    {
       JFrame f = new JFrame("Test");
       JScrollPane sp;

       f.setContentPane( sp = new JScrollPane( pane = new test2(),
                                          JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                                          JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
                                           ) );

       sp.addComponentListener( new ComponentAdapter() {
          public void componentResized( ComponentEvent ev )
          {
             JComponent c = (JComponent)ev.getSource();
             Insets i = c.getInsets();

             pane.setPreferredSize( new Dimension( c.getWidth()-i.left-i.right,
                                                   c.getHeight()) );
             pane.revalidate();
          }
       } );

       pane.addComponentListener( new ComponentAdapter() {
          public void componentResized( ComponentEvent ev )
          {
             JComponent c = (JComponent)ev.getSource();
             Dimension currentPrefSize = c.getPreferredSize();
             Component lastComp = c.getComponent( c.getComponentCount()-1 );

             int newHeight = lastComp.getLocation().y + 
lastComp.getHeight() + c.getInsets().bottom;

             currentPrefSize.height = newHeight;
             c.setPreferredSize( currentPrefSize );
             c.revalidate();
          }
       } );

       f.setBounds( 100,100,300,300 );
       f.show();
    }

    public test2()
    {
       for( int i=0; i<20; i++ )
          add( new JButton(""+i) );
    }
}


At 02:12 PM 3/4/2002, Reinstein, Lenny wrote:
>I did, but that does not help. It does not scroll vertically.
>
>-----Original Message-----
>From: Dmitry Beransky [mailto:[EMAIL PROTECTED]]
>Sent: Monday, March 04, 2002 5:01 PM
>To: '[EMAIL PROTECTED]'
>Subject: Re: Interesting Problem with Scrolling.
>
>
>You need to disable horizontal scrolling.  See
><http://java.sun.com/j2se/1.3/docs/api/javax/swing/JScrollPane.html#JScrollP
>ane(java.awt.Component,%20int,%20int)>
>
>
>Dmitry
>
>
>At 01:50 PM 3/4/2002, Reinstein, Lenny wrote:
> >When I just use the panel by itself with the set size, as soon as there's
> >no more place for components in one rows, they automaticaly wrap aroung
> >However, when I place the same panel into a JScrollPane, they don't wrap
> >anymore.
>
>_______________________________________________
>Advanced-swing mailing list
>[EMAIL PROTECTED]
>http://eos.dk/mailman/listinfo/advanced-swing
>_______________________________________________
>Advanced-swing mailing list
>[EMAIL PROTECTED]
>http://eos.dk/mailman/listinfo/advanced-swing

_______________________________________________
Advanced-swing mailing list
[EMAIL PROTECTED]
http://eos.dk/mailman/listinfo/advanced-swing

Reply via email to