Schaukel Laien Paginierung

Bevor ich anfange, gibt es eine ähnliche Frage (von mir). Ich möchte, dass diese gestrichen wird, da ich meinen Punkt dort nicht gut erklärt habe, aber nicht diese. Vielen Dank.

Erstens habe ich keinen Code, dies ist nur ein Konzept, das ich nicht herausfinden kann. Aber es ist interessant (zumindest für mich).

Sie alle wissen, wie MSWord funktioniert. Du schreibst Zeug. Wenn Sie dann eine Seite füllen, wird eine neue Seite erstellt und das Schreiben auf dieser Seite gestartet. Wenn Sie auf der ersten Seite weiteren Text einfügen, wird alles nach unten verschoben. Wenn Sie einen großen Textabschnitt auf einer Seite löschen, wird ein Teil des Texts auf der vorherigen Seite abgesaugt. Wenn Sie es zu tun haben, z. Bilder und Sie haben eines oben auf einer Seite, wodurch die Größe verringert wird, weil es auf die vorherige Seite gesaugt wird, wenn genügend Platz für die verkleinerte Version des Bildes vorhanden ist.

Jetzt, da Sie so denken, möchte ich dieses Konzept auf Java Swing übertragen. Seiten sind JPanels, und Bilder und Textblöcke (oder -zeilen) sind JPanels, die auf das JPanel der Seite angepasst werden.

Ich bin auf die Idee gekommen (okay, ich habe gelogen, ich habe etwas Code, aber es ist ein Chaos und es funktioniert sowieso nicht) mit einer Methode, die einen Füllstoff verwendet, was nicht in allen Fällen funktioniert. Wenn Sie wissen möchten, warum, lesen Sie zwischen den beiden Zeilen, ansonsten überspringen Sie es einfach.

Die Struktur selbst ist also leicht zu replizieren, aber die Aufrechterhaltung ist ein Schmerz im Nacken. Sie sehen, es gibt zwei Haupttypen von Ereignissen, die auftreten können:

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

Indem Sie einen Filler als letzte Komponente einer Seite verwenden und einen componentAdapter (componentResized) daran anhängen, können Sie diese Änderungen überwachen.

Diese Änderungen können weiter unterteilt werden in:

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

Unter Berücksichtigung dieser Ereignisse können viele Dinge passieren. Überspringen Sie die einfachen Fälle und sehen Sie sich das folgende Beispiel an:

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
---
---
---
---
---
---
---
---
---}

Jede Seite hat eine Höhe von 15 Zeilen. Schauen Sie jetzt, was passiert, wenn Sie die Höhe des Elements 1 der zweiten Seite um eine Zeile verringern. Es wird 4 Zeilen hoch, so dass es auf die vorherige Seite passt und aufgesaugt wird. Dadurch werden 5 (1 gelöschte Zeile + 4 aufgesaugte Zeilen) Zeilen mit freiem Speicherplatz auf der zweiten Seite erstellt. Das saugt alle fünf Elemente auf der dritten Seite auf und lässt die dritte Seite leer (die jetzt gelöscht werden sollte).

Der Grund, warum dies nicht funktioniert, ist, dass beim Löschen ein Listener für die zweite Seite ausgelöst wird und sowohl das oberste Element nach oben schieben als auch die Elemente von der vorherigen Seite aufsaugen muss. Da alles in einem Listener erledigt ist, muss ich warten, bis es ausgeführt wird, um visuelle Änderungen in meinem Programm zu registrieren. Da es zwei Dinge auf einer Seite ändern muss, kommt es zu einer Art Hörer-Chaos. Die Seitenhöhe wird zweimal reduziert, aber nur einmal registriert, und am Ende kann ich nur den oberen Teil oder den unteren Teil oder eine einzelne Komponente auf jeder Seite vollständig verschieben. Dies ist keine gute Erklärung, aber wenn Sie verstehen, wie Swing funktioniert, sollten Sie in der Lage sein, die Punkte selbst zu verbinden.

Wie ich bereits erwähnt habe, habe ich den Code dafür geschrieben, aber es ist lang und schwer zu befolgen, und ich kann ihn hier posten, wenn jemand den Wunsch zeigt, ihn zu sehen. Und ich spreche über die SSCCE. Es kann wirklich nicht in ein paar Zehntel Zeilen Code gekürzt werden.

Was ich möchte, ist das Überspringen des Schreibens eines Algorithmus, der die Struktur des "Dokuments" beibehält und alle Elemente verschiebt, da es eine wirklich komplizierte Sache ist, alle zahlreichen Fälle zu berücksichtigen.

Was ich will, ist eine Alternative und ich frage Sie, ob Sie irgendwelche Ideen haben. Eine Sache, die mir einfiel, war, eine Komponente zu haben, die der von JPanel ähnelt. Es hätte Teile mit fester Höhe, die mit anderen Komponenten bestückt werden können, und dazwischen Teile mit fester Höhe, die nicht bestückbar (?) Oder "fest" sind.

So würde es funktionieren, dass jedes Mal, wenn Sie populable (?) Teile hinzufügen, diese automatisch neu angeordnet werden. Wenn etwas nicht zum aktuellen befüllbaren Teil passt, wird es nur zum nächsten verschoben (ähnlich wie das Verticall-Box-Layout funktioniert, wenn einem Punkt eine Sache hinzugefügt wird, werden alle anderen nach unten gedrückt), der feste Teil wird jedoch übersprungen.

Da ich auch in der Lage sein müsste zu sagen, in welchem ​​befüllbaren Teil eine bestimmte Komponente ist, weiß ich nicht, ob das Erstellen einer solchen Struktur in Java Swing möglich ist.

Gut, jeder Rat ist willkommen, einschließlich externer Freiheiten.

Beachten Sie jedoch, dass es sich bei dem gesamten Dokument um ein Dokument mit Seiten handelt, die nacheinander im Ansichtsfenster eines JScrollPane platziert werden. Dies ist die einzige Beschränkung, nach der das Dokument aussehen sollte.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage