Ver Mensaje Individual
  #2 (permalink)  
Antiguo 27/05/2011, 23:09
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Delimitar Panel con scroll y FlowLayout

Hola,

Cita:
Iniciado por karson Ver Mensaje
... Resumiendo poner un scroll vertical a un panel con flowlayout y que la anchura maxima del panel sea la anchura del scroll, sin embargo la altura la que sea necesaria e incluso se vaya incrementado y el scroll haciendo su trabajo ...
¿Y por qué FlowLayout?

El FlowLayout está hecho para que los controles 'fluyan' de un lado a otro del contenedor y el ancho máximo del contenedor está especificado por el ancho máximo del 'contenedor del contenedor', valga la redundancia. El jScrollPane1 está hecho para que no exista un ancho máximo, es decir, el ancho máximo está especificado por el contenido.

En otras palabras, el de afuera le dice que no hay máximo de ancho y el de adentro se ajusta a eso poniendo todo en una sola fila. Si le pones un ancho máximo al de adentro entonces siempre este se ajustará al mismo aunque el de afuera cambie de tamaño.

Solución ... no usar una herramienta para lo que no está hecha y usar otra que efectivamente hace correctamente y sin complicaciones el objetivo deseado.

Por ejemplo ...

Código Java:
Ver original
  1. import java.awt.Dimension;
  2. import java.awt.event.ComponentEvent;
  3. import java.awt.event.ComponentListener;
  4.  
  5. public class JFrame extends javax.swing.JFrame implements ComponentListener {
  6.  
  7.     private javax.swing.JPanel jPanel1;
  8.     private javax.swing.JScrollPane jScrollPane1;
  9.  
  10.     public JFrame() {
  11.         initComponents();
  12.     }
  13.  
  14.     private void initComponents() {
  15.         jScrollPane1 = new javax.swing.JScrollPane();
  16.         jPanel1 = new javax.swing.JPanel();
  17.  
  18.         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  19.         setPreferredSize(new Dimension(640, 480));
  20.  
  21.         jPanel1.setLayout(new java.awt.GridLayout(0, 640 / 120));
  22.         jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  23.         jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
  24.         jScrollPane1.setViewportView(jPanel1);
  25.         jScrollPane1.addComponentListener(this);
  26.         getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
  27.  
  28.         for (int i = 1; i <= 158; i++) {
  29.             javax.swing.JButton button = new javax.swing.JButton("Button ".concat(String.valueOf(i)));
  30.             button.setPreferredSize(new Dimension(120, 40));
  31.             jPanel1.add(button);
  32.         }
  33.  
  34.         pack();
  35.         setLocationRelativeTo(null);
  36.     }
  37.  
  38.     @Override
  39.     public void componentResized(ComponentEvent e) {
  40.         if (e.getComponent().getWidth() > 120)
  41.             ((java.awt.GridLayout)jPanel1.getLayout()).setColumns(
  42.                     e.getComponent().getWidth() / 120);
  43.         jPanel1.doLayout();
  44.     }
  45.  
  46.     @Override
  47.     public void componentMoved(ComponentEvent e) {
  48.     }
  49.  
  50.     @Override
  51.     public void componentShown(ComponentEvent e) {
  52.     }
  53.  
  54.     @Override
  55.     public void componentHidden(ComponentEvent e) {
  56.     }
  57.  
  58. }

Saludos,