2010-04-26 24 views
9

Tengo un JScrollpane que tiene un JPanel en el interior (y el panel contiene algunos JLabel s).JScrollpane necesita reducir su ancho

Quiero cambiar el tamaño del panel de desplazamiento para cambiar realmente su tamaño (posiblemente por debajo del tamaño preferido de los componentes internos), no sólo el tamaño de la ventana gráfica.

El objetivo es que el panel interior a desaparecer con gracia (usando las prioridades específicas de contracción y similares en mi miglayout) cuando el usuario se contrae el panel de desplazamiento demasiado pequeño.

+0

La pregunta es bastante claro para mí, pero quizá podría monitorizar los cambios de tamaño de la JScrollPane y reaccionar cuando llega a ser más bajo que algunos unida (esconderlo sin problemas) –

+0

Parece que hacer algunas cosas tontas de relayout cuando el tamaño del 'JViewport' cambia es la única forma de hacerlo. (Para aclarar, que, básicamente, tiene una mesa dentro de la ventana de un panel de desplazamiento. Quiero que el panel de desplazamiento para determinar qué filas de la tabla se muestran, pero yo no quiero que afecte lo que las columnas se muestran. Lo que yo quiero hacer es asignar una prioridad contracción de las distintas columnas de manera que reducir el tamaño horizontal del cuadro de texto comenzará a truncar columnas específicas.) – Mike

Respuesta

14

probablemente el mejor método es tener el componente contenido sea siempre la misma anchura que la ventana gráfica. Para ello el primer componente contenido (el que es el hijo de JViewPort, pasado al constructor JScrollPane o un conjunto como el viewportView) necesita implementar javax.swing.Scrollable. El método clave es getScrollableTracksViewportWidth, que debe devolver true.

Aquí está un rápido y sucio JPanel desplazable:

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; 
    } 
} 
+0

impresionante, gracias! No estaba al tanto de la interfaz desplazable. – Mike

+0

Una cosa más. Solo obtuve esta solución trabajando con 'BorderLayout'. El valor predeterminado 'FlowLayout' no funciona correctamente para vistas muy amplias. –

+0

No utilice el diseño de flujo. Solo es adecuado para demos y barras de botones. Ahora hay forma de seguir el ancho de un diseño de flujo. – shemnon

Cuestiones relacionadas