Foros del Web » Programación para mayores de 30 ;) » Java »

Delimitar Panel con scroll y FlowLayout

Estas en el tema de Delimitar Panel con scroll y FlowLayout en el foro de Java en Foros del Web. Hola, veamos si me puedo explicar bien. Tengo un Frame con lo siguiente: Hay un panel en el que voy añadiendo un componente creado por ...
  #1 (permalink)  
Antiguo 27/05/2011, 05:02
 
Fecha de Ingreso: mayo-2011
Mensajes: 22
Antigüedad: 13 años
Puntos: 0
Pregunta Delimitar Panel con scroll y FlowLayout

Hola, veamos si me puedo explicar bien.

Tengo un Frame con lo siguiente:
Hay un panel en el que voy añadiendo un componente creado por mi que representa una diapositiva. El layout que tiene es FlowLayout.
Como pueden ir muchas deseo ponerle un scroll vertical (solo vertical)
Entonces creo el Jscrollpane le configuro para que solo tenga scroll vertical, le situó en el Frame y digo que su setViewportView sea el panel con el flowlayout.

Ahora comienzan los problemas, deseo que a medida que voy añadiendo diapositivas, estas se vayan colocando en el panel FlowLayout y cuando no entren bajen a la fila de abajo. Como lo tengo siguen indefinidamente hacia la derecha... como si el panel fuera infinito. (pero repito que no quiero scroll horizontal)
Me gustaria saber como puedo delimitar la anchura del flowlayout.
Lo logre hacer, pero entonces el scroll no me funcionaba correctamente.

Y para complicarlo un poco mas, lo logre hacer mas o menos chapuceramente, el problema es que en el momento que redimensionaba la ventana dejaba todo de funcionar. (por poner dimensiones al setpreferensize manualmente).

Alguien sabe la manera rápida y simple de hacer lo que pido?
Si hay dudas puedo explicar y aportar el código que sea necesario.
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

Gracias!!

Última edición por karson; 27/05/2011 a las 05:20
  #2 (permalink)  
Antiguo 27/05/2011, 23:09
Avatar de 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,
  #3 (permalink)  
Antiguo 28/05/2011, 07:52
 
Fecha de Ingreso: mayo-2011
Mensajes: 22
Antigüedad: 13 años
Puntos: 0
Respuesta: Delimitar Panel con scroll y FlowLayout

Ooooooooooook, muchas gracias.
Entedi lo que me dijiste, ejecute tu código y algo asi busco, solo que no desearía que los botones (mis diapositivas) se redimensionaran algo.
Pensaba que habría alguna manera para dar una anchura fija al flowlayout, intentare hacerlo con el GridLayout e intentar que no se redimensione las diapositivas.
En lugar de eso me deje huecos en blanco entre diapositiva y diapositiva. Muchas gracias de nuevo.
;)
  #4 (permalink)  
Antiguo 28/05/2011, 08:38
Avatar de 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
... Pensaba que habría alguna manera para dar una anchura fija al flowlayout, intentare hacerlo con el GridLayout e intentar que no se redimensione las diapositivas.
En lugar de eso me deje huecos en blanco entre diapositiva y diapositiva. Muchas gracias de nuevo.
;)
Bueno, igual no estoy seguro si necesitas un Grid, porque un Grid es como una tabla, donde cada componentes ocupa una casilla exactamente y no es lo mismo que el FlowLayout donde cada componente ocupa el espacio que necesita. Pero lo único de lo que estoy seguro es que no puedes usar un FlowLayout dentro de un ScrollPane y esperar que se ajuste automáticamente en varias líneas de una forma 'rápida y simple'.

La idea es que posiblemente el ejemplo no sea exactamente lo que necesitas, pero muestra que hay otras formas de hacerlo, aunque necesites un Layout mucho mas complejo o tengas que hacer tu propio Layout, JPanel o JScrollPanel, o posiblemente modificar el comportamiento del FlowLayout, pero no va a ser 'rápido y simple'.

Saludos,

ps:

El ejemplo a mi me sirvió para mostrar información parecida que representaba imágenes de productos de una base de datos con ciertos diferencias, pero lograba el objetivo que yo quería, por eso escribí usar la herramienta adecuada, pero eso se aplicaba a mi programa y a veces se me olvida aclararlo.

Última edición por HackmanC; 28/05/2011 a las 08:52 Razón: ps
  #5 (permalink)  
Antiguo 28/05/2011, 09:14
 
Fecha de Ingreso: mayo-2011
Mensajes: 22
Antigüedad: 13 años
Puntos: 0
Respuesta: Delimitar Panel con scroll y FlowLayout

Bueno, creo que ya lo tengo mas o menos funcionando.
Una ultima pregunta, hay algun sistema para que cuando añada, en tu ejemplo por ejemplo, un solo boton, este lo centre como haria el flowlayout y no aparezca a la izquierda¿?

Muchas gracias de nuevo. Estaba bloqueado y vi la salida!! :D

Etiquetas: panel, scroll
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:55.