Swing layman pagination

Zanim zacznę, podobne pytanie (moje) istnieje, chciałbym, aby to zostało usunięte, ponieważ nie wyjaśniłem dobrze mojego punktu, ale nie tego. Dziękuję Ci.

Po pierwsze, nie mam kodu, to tylko koncepcja, której nie mogę zrozumieć. Ale to interesujące (przynajmniej dla mnie).

Wszyscy wiecie, jak działa MSWord. Piszesz rzeczy. Następnie po wypełnieniu strony utworzy nową stronę i zacznie pisać na tej stronie. Jeśli wkleisz więcej tekstu na pierwszej stronie, wszystko zostanie przesunięte w dół. Jeśli usuniesz dużą część tekstu na stronie, spowoduje to wyssanie części tekstu z poprzedniej strony. Jeśli masz do czynienia np. Z zdjęcia i masz jedną na górze strony, zmniejszając jej rozmiar, ponieważ powoduje to, że wciągam ją do poprzedniej strony, jeśli jest wystarczająco dużo miejsca na zredukowaną wersję obrazu.

Teraz, gdy myślisz w ten sposób, chcę przenieść tę koncepcję do Java Swing. Strony są JPanels, a zdjęcia i kawałki (lub linie) tekstu są JPanels dopasowane do strony JPanel.

Przyszedłem (okej, skłamałem, mam jakiś kod, ale to bałagan i tak nie działa) za pomocą metody wykorzystującej wypełniacz, która nie działa we wszystkich przypadkach. Jeśli chcesz wiedzieć dlaczego, przeczytaj między dwoma wierszami, w przeciwnym razie pomiń go.

Tak więc sama struktura jest łatwa do powtórzenia, ale utrzymanie jej jest bólem szyi. Widzicie, istnieją dwa główne typy zdarzeń, które mogą wystąpić:

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

Używając wypełniacza jako ostatniego składnika strony i dołączając do niego komponentAdapter (componentResized), możesz monitorować te zmiany.

Zmiany te można dalej podzielić na:

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

Biorąc pod uwagę te wydarzenia, może się zdarzyć wiele rzeczy. Pomijając proste przypadki, spójrz na ten przykład:

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

Każda strona ma wysokość 15 rzędów. Zobacz, co się stanie, jeśli zmniejszysz wysokość elementu 1 drugiej strony o jeden wiersz. Stanie się on 4 rzędami wysokości, dzięki czemu będzie pasował do poprzedniej strony, zostanie wessany. Spowoduje to utworzenie 5 (1 usunięty wiersz + 4 wyssane wiersze) wartości rzędu wolnego miejsca na drugiej stronie. Spowoduje to wyssanie wszystkich pięciu elementów na trzeciej stronie i pozostawienie trzeciej strony pustej (która powinna zostać usunięta).

Powodem, dla którego to nie zadziałałoby, jest to, że po usunięciu, słuchacz jest wyzwalany dla drugiej strony i musi zarówno pchnąć górny element, jak i wyssać elementy z poprzedniej strony. Ponieważ wszystko jest zrobione w słuchaczu, muszę poczekać na jego wykonanie, aby zarejestrować wizualną zmianę w moim programie. Ponieważ musi zmienić dwie rzeczy na stronie, dochodzi do chaosu słuchacza. Wysokość strony jest dwukrotnie zmniejszana, ale jest rejestrowana tylko raz, a na końcu mogę w pełni przesunąć tylko górną część lub dolną część lub pojedynczy element z każdej strony. To naprawdę nie jest dobra eksploracja, ale jeśli rozumiesz, jak działa swing, powinieneś być w stanie samodzielnie połączyć kropki.

Jak już wspomniałem wcześniej, napisałem kod do tego, ale jest długi i trudny do śledzenia, i mogę go tutaj opublikować, jeśli ktoś pokaże, że chce go zobaczyć. Mówię o samym SSCCE. Naprawdę nie można go skrócić do kilkunastu wierszy kodu.

Chciałbym pominąć pisanie algorytmu, który utrzymywałby strukturę „dokumentu” i przenosiłby wszystkie elementy dookoła, ponieważ jest to naprawdę skomplikowana sprawa, biorąc pod uwagę wszystkie liczne przypadki.

To, czego chcę, to alternatywa i pytam, czy masz jakieś pomysły. Jedną rzeczą, która przyszła mi do głowy, jest posiadanie komponentu podobnego do JPanel. Miałoby ustalone części wysokości, które można zapełnić innymi komponentami, a między nimi ustalono części wysokości, które nie są możliwe (?) Lub „stałe”.

Byłoby tak, że za każdym razem, gdy dodasz coś do popularnych (?) Części, zostaną one automatycznie zmienione. Jeśli coś nie pasuje do aktualnej, popularnej części, jest po prostu przenoszone do następnej (podobnie jak działa układ pionowego pionu, dodawanie jednej rzeczy do miejsca popycha wszystkie pozostałe w dół), ale przeskakuje część stałą.

Ponieważ musiałbym być w stanie powiedzieć, w której części jest dany komponent, nie wiem, czy tworzenie takiej struktury jest możliwe w huśtawce Java.

Cóż, każda rada jest mile widziana, w tym libaria zewnętrzne.

Po prostu pamiętaj, że ten cały dokument jest dokumentem ze stronami, które byłyby umieszczane jeden za drugim w rzutni JScrollPane, i to jest jedyny limit tego, jak powinien wyglądać.

questionAnswers(1)

yourAnswerToTheQuestion