Tengo un JScrollPane con un JTable en ella. En el JTable he inicialmente de 3 filas. Más tarde en las filas del agregado.

El valor predeterminado JTable con mis 3 filas es feo porque JScrollPane llamadas getPreferredScrollableViewportSize desde el cliente (JTable) y el valor de retorno es siempre el mismo. Es por eso que mi JTable/JScrollpane con 3 filas de este espacio libre, JScrollpane andJTable no tienen el mismo tamaño.

Mi solución es hacer una subclase JTable, anular getPreferredScrollableViewportSize y de retorno de esta función getPreferredSize();. Ahora todo el JScrollPane tiene exactamente el tamaño de la 3 fila `JTable!

Cuando una fila se añade tengo el comando ((JComponent) scrollPane.getParent()).revalidate();

Scrollpane crece con la tabla.

Todo funciona bien!

Pero ahora quiero establecer un determinado diseño para el contenedor del componente scrollpane (panel):
myjpanel.setLayout (new BoxLayout(contentPane, BoxLayout.Y_AXIS));

Cuando puedo añadir este comando toda mi solución no funciona más.
El componente scrollpane no es cierto que el tamaño de la 3 fila de la tabla, este espacio libre es de allí de nuevo.

¿Por qué es esto?

¿Alguien tiene una solución?

CONTINUÓ

Gracias camickr para que me apunta en la dirección correcta. Mi solución es la siguiente:

    scrollPane = new JScrollPane (table) {          
      public Dimension getMaximumSize () {
        double height = 0;

        double width = super.getMaximumSize().getWidth();
        height += columnHeader.getViewSize().getHeight();           
        height += viewport.getView().getPreferredSize().getHeight();
        height += (getViewportBorderBounds().getHeight() * -1);
        Dimension returnValue = new Dimension ((int) width, (int) height);
        return returnValue;
      }
    };

Funciona ahora en el comienzo.
Pero cuando se agrega una fila a la jtable y yo llame a validar(); en el jpanel (contenedor primario de la scrollpanel) la jscrollpanel se encoge en altura a 1 fila + encabezado!
Ha alguien tiene una idea de lo que se puede hacer en esta situación.

CONTINUÓ

Ahora sé que el problema. Es el viewportBorder. Con el fin de obtener la totalidad, la altura exacta que tengo para el total de la altura de la vista (Jtable), la altura de la cabecera de la columna y la altura de la viewportBorder. La primera vez getViewportBorderBounds().getHeight() devuelve -3, la próxima vez – después de que se inserta una nueva fila en la tabla modelo – la función devuelve 48. Yo no entiendo por qué esta función devuelve 48 ahora.
Otro punto es que camickr dice que al cambiar el tamaño de la jscrollpane derrotas el propósito del componente scrollpane. Yo no entiendo esto. ¿Cómo puede alguien estar satisfecho con un defecto jscrollpane tamaño de 450 x 400 (http://www.javalobby.org/java/forums/t19559.html) incluso cuando el jtable tiene sólo 3 líneas al principio. Esto sin relleno extra de espacio no se ve muy profesional en mi ojos. Ha alguien tiene una mejor solución para esto.

Muchas gracias por sus respuestas

CONTINUA
Ahora todo funciona bien!
Al principio me basta con ajustar el jscrollpane frontera a 0 … sp.setBorder(createEmptyBorder());
De esta manera evito que estos extraños valores de retorno de getViewportBorderBounds().getHeight()
Wolfgang

  • hmmm myTable.setFillsViewportHeight(true/false);

2 Comentarios

  1. 2

    El BoxLayout permite que el componente crecer hasta el tamaño máximo de la componente. Supongo que usted necesita para reemplazar el getMaximumSize() del componente scrollpane para devolver el tamaño preferido.

    Cuando una fila se añade tengo el comando «((JComponent) scrollPane.getParent()).validar();» El scrollpane crece con el jtable.

    Ese tipo de derrotas el propósito del componente scrollpane. La barra de desplazamiento se supone que debe estar en un tamaño fijo y, a continuación, barras de desplazamiento aparecerá si es necesario.

  2. 1

    He tenido un problema similar – el resultado de todo esto es que yo quería un JTable en un panel de desplazamiento que tenía un tamaño mínimo y máximo: cuando no hay datos en la tabla, se debe tener un uno-fila-la altura del panel de fondo que se muestra (no es una falsificación de la fila, obviamente), y cuando era de más de 10 filas para limitar la muestra el tamaño de la mesa a los 10 filas más barras de desplazamiento. Cualquier tamaño entre 1 y 10 debe mostrar la tabla en toda su altura. La situación era un padre-hijo de la tabla, y este era el hijo de la tabla, por lo que tuve que desencadenan el niño de tamaño de tabla, dependiendo de cuál de los padres de la fila de la tabla se ha hecho clic. Un panel fijo de tamaño se veía feo en la que llevó hasta innecesario de espacio para empujar a otros potencialmente visible de información bajo el hijo de la tabla, fuera de la vista con solo espacio en blanco.

    El uso de la setPreferredScrollableViewportSize después de actualizar el modelo con el niño filas (y setFillsViewportHeight(verdadero), por supuesto) me dio casi todo lo que yo necesitaba. Salvo que la ventanilla no redibujar hasta que se hace clic en él, o el foco de la ventana, a continuación, echó hacia atrás, era de lo más molesto.

    La solución fue súper sencilla después de leer este post: acabo de llamar a revalidar en el scrollpane del padre, como se señaló en la solución. Se fija a la perfección. En su mayoría sólo quería compartir un caso de uso donde desea que el componente scrollpane de cambio de tamaño de forma dinámica a un tamaño máximo. Swing es mucho más sencillo si todo es creado en un tamaño fijo para siempre… a diferencia de casi todos los de la vida real de casos de uso que me he encontrado 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here