Свинг дилетант

Прежде чем я начну, похожий вопрос (мой) существует, я бы хотел, чтобы этот вопрос был удален, поскольку я не очень хорошо объяснил свою точку зрения, но не этот. Спасибо.

Прежде всего, у меня нет кода, это только концепция, которую я не могу понять. Но это интересно (по крайней мере для меня).

Вы все знаете, как работает MSWord. Вы пишете вещи. Затем, когда вы заполните страницу, она создаст новую страницу и начнет писать на этой странице. Если вы вставите еще немного текста на первую страницу, все будет сброшено. Если вы удалите большой кусок текста на странице, он высосет часть текста на предыдущей странице. Если вы имеете дело, например, с картинки, и у вас есть одна в верхней части страницы, уменьшая ее размер, потому что она высосана до предыдущей страницы, если есть достаточно места для уменьшенной версии картинки.

Теперь, когда вы так думаете, я хочу перенести эту концепцию в Java Swing. Страницы - это JPanel, а картинки и фрагменты (или строки) текста - это JPanels, размещенные на странице JPanel.

Я подошел (хорошо, я солгал, у меня есть некоторый код, но это беспорядок, и он все равно не работает) с методом, использующим Filler, который работает не во всех случаях. Если вы хотите знать почему, читайте между двумя строками, в противном случае просто пропустите.

Таким образом, сама структура легко копируется, но поддержание ее - боль в шее. Видите ли, есть два основных типа событий, которые могут произойти:

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

Используя Filler в качестве последнего компонента страницы и добавив к нему componentAdapter (componentResized), вы можете отслеживать эти изменения.

Эти изменения могут быть далее разделены на:

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

Принимая во внимание эти события, многое может произойти. Пропустив простые случаи, посмотрите на этот пример:

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

Каждая страница имеет высоту 15 строк. Посмотрите, что произойдет, если вы уменьшите высоту элемента 1 второй страницы на одну строку. Она станет высотой в 4 строки, чтобы она соответствовала предыдущей странице и была поглощена. Это создаст 5 (1 удаленная строка + 4 засасываемых строки) свободного места на второй странице. Это высосет все пять элементов на третьей странице и оставит третью страницу пустой (которая теперь должна быть удалена).

Причина, по которой это не сработает, заключается в том, что после удаления прослушиватель запускается для второй страницы, и он должен как подтолкнуть верхний элемент вверх, так и высосать элементы с предыдущей страницы. Поскольку все это делается в слушателе, мне нужно дождаться его запуска, чтобы зарегистрировать визуальное изменение в моей программе. Так как он должен изменить две вещи на странице, это приводит к некоторому хаосу слушателя. Высота страницы уменьшается вдвое, но регистрируется только один раз, и в конце я могу полностью переместить только верхнюю часть или нижнюю часть или один компонент с каждой стороны. Это не очень хорошее объяснение, но если вы понимаете, как работает свинг, вы сможете соединить точки самостоятельно.

Как я упоминал ранее, я написал код для этого, но за ним долго и трудно следовать, и я могу опубликовать его здесь, если кто-то проявит желание его увидеть. И я говорю о самом SSCCE. Это действительно не может быть сокращено до пары десятков строк кода.

Я хотел бы пропустить написание алгоритма, который бы поддерживал структуру «документа» и перемещал все элементы, поскольку это действительно сложная вещь, принимая во внимание все многочисленные случаи.

То, что я хочу, - это альтернатива, и я спрашиваю вас, есть ли у вас какие-либо идеи. Одна вещь, которая пришла мне в голову, это наличие компонента, похожего на JPanel. Он будет иметь фиксированные по высоте части, которые могут быть заполнены другими компонентами, а между ними фиксированные по высоте части, которые непопулярны (?) Или «сплошные».

Это будет работать так, что каждый раз, когда вы добавляете что-то к заполненным (?) Частям, они автоматически переопределяются. Если что-то не подходит для текущей заполненной части, оно просто перемещается к следующей (аналогично тому, как работает вертикальный макет блока, добавление одной вещи в точку выталкивает все остальные вниз), но пропускает сплошную часть.

Поскольку я также должен был бы иметь возможность определить, в какой заполненной части находится определенный компонент, я не знаю, возможно ли создание такой структуры в Java Swing.

Ну, любой совет приветствуется, включая внешние библиотеки.

Просто помните, что весь этот документ является документом со страницами, которые будут помещаться одна за другой в область просмотра JScrollPane, и это единственное ограничение того, как он должен выглядеть.

Ответы на вопрос(1)

Ваш ответ на вопрос