vertical horizontal agregar java swing jtable jscrollpane

java - horizontal - jtable scroll vertical



Reducir el panel JScroll a la misma altura que JTable (5)

Utilice un administrador de GridBagLayout y establezca el tamaño máximo de JScrollPane en lo que desee. Si la tabla es más grande, JScroll no crecerá más allá de ese tamaño.

Luego, agregue un componente de pegamento (creo que es algo así como BoxLayout.createVerticalGlue o algo así) que es un componente vacío que solo ocupa el espacio restante.

Entonces, cuando la tabla es más pequeña, este componente ocupará el espacio restante, si la tabla es más grande, no tomará nada ya que JScrollPane lo está usando.

Actualmente tengo JTables anidados en JScrollPanes así:

Mi problema es que el número de filas en cada tabla es variable cuando se crea la tabla. Lo que quiero hacer es hacer el JScrollpane más pequeño si la tabla es demasiado corta, pero quiero mantenerlo en un tamaño establecido si la tabla es demasiado larga.

¿Cómo puedo lograr esto?


Dimension d = table.getPreferredSize(); scrollPane.setPreferredSize( new Dimension(d.width,table.getRowHeight()*rows+1));

Donde rows representa el número de filas de datos, o el límite.


Si usa MigLayout, cuando agrega el panel de desplazamiento que contiene JTable, puede especificar la restricción growx lugar de grow , para que se extienda solo horizontalmente.

Ahora el scrollpane está ubicado en el medio de su padre. Puede establecer en la restricción de fila para que se alinee a la top de la fila. O bien, en la restricción del componente: aligny top .


Yo uso setPreferredScrollableViewportSize() en este contexto, seguido de pack() o revalidate() según sea necesario.

Apéndice:

¿Como lo usas?

Es una característica de la implementación de Scrollable en JTable . Aquí hay varios ejemplos . El getPreferredScrollableViewportSize() complementario también puede ser útil.


El siguiente código (actualmente aceptado) no tiene en cuenta varios aspectos del Look and Feel:

Dimension d = table.getPreferredSize(); scrollPane.setPreferredSize( new Dimension( d.width, table.getRowHeight() * (rows+1) ));

  1. La línea del encabezado no es necesariamente table.getRowHeight() píxeles de alto. (En el "Metal" L y F, es más alto)
  2. Una barra de desplazamiento vertical en el scrollPane aplastará la mesa más pequeña que su tamaño preferido.
  3. Una barra de desplazamiento horizontal ocupará espacio adicional, de modo que no estarán visibles todas las rows filas solicitadas.

El siguiente código debería usarse en su lugar:

table.setPreferredScrollableViewportSize( new Dimension( table.getPreferredSize().width, table.getRowHeight() * visible_rows));

El scrollPane le preguntará a la tabla por su tamaño preferido, y agrega espacio adicional para el encabezado y las barras de desplazamiento.

A continuación se muestra la diferencia en una JTable con 4 filas, cuando visible_rows se reduce de 4 a 3 . El ancho preferido de JScrollPane se rellena automáticamente para incluir la barra de desplazamiento en lugar de compactar las columnas de la tabla. También se proporciona automáticamente un espacio para el encabezado (que es diferente de la altura de la fila); no está incluido en el recuento de visible_rows .