Paginación del laico del oscilación

Antes de comenzar, existe una pregunta similar (mía), me gustaría que esa fuera eliminada ya que no expliqué bien mi punto allí, pero no este. Gracias.

En primer lugar, no tengo código, este es solo un concepto que no puedo entender. Pero es interesante (al menos para mí).

Todos ustedes saben cómo funciona MSWord. Tu escribes cosas Luego, cuando llene una página, se creará una nueva página y comenzará a escribir en esa página. Si pega algo más de texto en la primera página, todo será empujado hacia abajo. Si elimina una gran parte del texto de una página, absorberá parte del texto de la página anterior. Si estás tratando con, por ejemplo. Las imágenes y usted tienen una en la parte superior de una página, lo que reduce su tamaño, por lo que puede ser absorbido hasta la página anterior, si hay suficiente espacio para la versión reducida de la imagen.

Ahora que estás pensando de esta manera, quiero transferir ese concepto a Java Swing. Las páginas son JPanels, y las imágenes y los fragmentos (o líneas) del texto son JPanels ajustados en la página JPanel.

He venido (bueno, mentí, tengo algo de código, pero es un desastre y no funciona de todos modos) con un método que usa un Filler, que no funciona en todos los casos. Si desea saber por qué, lea entre las dos líneas, de lo contrario, sáltese.

Entonces, la estructura en sí es fácil de replicar, pero mantenerla es un dolor en el cuello. Usted ve, hay dos tipos principales de eventos que pueden ocurrir:

a) height of the page content has increased
b) height of the page content has decreased

Al usar un Filler como el último componente de una página y tener un componenteAdapter (componentResized) adjunto, puede monitorear esos cambios.

Estos cambios se pueden dividir en:

a) element is added/removed to/from page
b) height of the element has increased/decreased 

Teniendo en cuenta esos eventos pueden suceder muchas cosas. Saltándose los casos simples, mira este ejemplo:

Page 1:
{element 1
blabla
blabla}
{element 2
blabla}
{element 3}
{element 4
blabla
blabla
blabla
blabla}
{free space
---
---
---}

/

Page 2:
{element 1
blabla
blabla
blabla
blabla}
{element 2
blabla
blabla
blabla
blabla}
{element 3}
{element 4
blabla
blabla
blabla}

/

Page 3:
{element 1}
{element 2}
{element 3}
{element 4}
{element 5}
{free space
---
---
---
---
---
---
---
---
---}

Cada página tiene una altura de 15 filas. Mire ahora qué sucede si reduce la altura del elemento 1 de la segunda página en una fila. Se convertirá en 4 filas de alto, por lo que se ajusta a la página anterior, siendo aspirado. Eso creará 5 (1 fila eliminada + 4 filas succionadas) filas en espacio libre en la segunda página. Eso absorberá todos los cinco elementos de la tercera página y dejará la tercera página en blanco (que ahora debería eliminarse).

La razón por la que esto no funcionaría es porque al eliminarse, se activa un oyente para la segunda página y tiene que empujar el elemento superior hacia arriba y aspirar los elementos de la página anterior. Como todo se hace en un oyente, tengo que esperar a que se ejecute para registrar el cambio visual en mi programa. Ya que tiene que cambiar dos cosas en una página, se trata de algún tipo de caos de oyentes. La altura de la página se reduce dos veces, pero se registra solo una vez y al final puedo mover completamente solo la parte superior o la parte inferior, o un solo componente en cada lado. Esta no es realmente una buena explicación, pero si comprende cómo funciona el swing, debería poder conectar los puntos usted mismo.

Como mencioné antes, he escrito el código para eso, pero es largo y difícil de seguir, y puedo publicarlo aquí, si alguien muestra el deseo de verlo. Y estoy hablando de SSCCE en sí. Realmente no se puede reducir en un par de 10s de filas de código.

Lo que me gustaría es omitir la escritura de un algoritmo que mantuviera la estructura del "documento" y mover todos los elementos, ya que es una tarea realmente complicada, teniendo en cuenta los numerosos casos.

Lo que quiero es una alternativa y le pregunto si tiene alguna idea. Una cosa que me vino a la mente es tener un componente similar a JPanel. Tendría partes de altura fija que pueden ser pobladas con otros componentes, y entre ellas partes de altura fija que son impopulables (?) O "sólidas".

La forma en que funcionaría sería que cada vez que agregue algo a las partes (?) De la población, se reajustarán automáticamente. Si algo no se ajusta a la parte actual de la población, simplemente se mueve a la siguiente (de manera similar a cómo funciona el diseño vertical de la caja, agregando una cosa a un punto que empuja a todas las demás hacia abajo), pero omitiendo la parte sólida.

Dado que también tendría que ser capaz de decir en qué parte popular se encuentra un determinado componente, no sé si crear una estructura de este tipo es posible en Java swing.

Bueno, cualquier consejo es bienvenido, incluidas las bibliotecas externas.

Solo tenga en cuenta que todo este documento es un documento con páginas que se colocarán una detrás de otra en la vista de JScrollPane, y ese es el único límite a lo que debería ser.

Respuestas a la pregunta(1)

Su respuesta a la pregunta