Проблемы с созданием графического интерфейса

У меня есть настройка GUI, которая выглядит так:

пример

Он отображает документ и позволяет пользователю редактировать его, добавляя/удаляя JTextAreas и текст в них.

У меня проблема при попытке открыть документ. Сам документ состоит из слоев JPanels друг над другом. В графическом интерфейсе никогда не бывает более 6 слоев JPanels в одной точке.

Поскольку я не знаю, какой будет высота JTextArea, я должен сделать ее относительно родителя (другими словами, не указывать ее).

Поскольку менеджер компоновки (MigLayout) не знает точного размера компонента (он относительно родителя), он сначала запрашивает у родителя размер родителя. Этот размер снова неизвестен, и запрашивается родитель родителя и т. д. (до уровня 1 или 2 JPanel). В конце концов, он должен запрашивать у многих компонентов их размер (метод checkParent(Container) в MigLayout вызывался более 100 000 раз только для приведенного выше примера).

Что мне нужно сделать, так это установить высоту JTextArea (или JPanel, в которой он находится) только при открытии документа, поэтому менеджеру компоновки не нужно спрашивать JTextAreas родителя, вызывая рекурсивный ад.

После открытия документа мне нужно сбросить высоту по умолчанию (поэтому высота настраивается при добавлении/удалении текста).

Я абсолютно не знаю, как это сделать, или, если это путь, я только уверен, что проблема, которую я описал выше, является проблемой.

Несколько примечаний:

  • это не ошибка MigLayout, я был на форумах (ссылка ниже)
  • проверьте это (последнее сообщение)
  • Я не могу поместить JScrollPane в JTextArea, так как его задача не только хранить информацию, но и точно отображать, сколько места она занимает.
  • Я могу легко получить высоту JTextAreas при сохранении документа, поэтому они будут в моем распоряжении при повторном открытии.

РЕДАКТИРОВАТЬ: документ, на который ссылается этот вопрос, не является «документом», как это используется в JTextAreas и т.п., а «документом», как в пользовательском классе в моей программе (о котором я не упоминал, потому что это не имеет значения, если только это понимается как "документ").


person Karlovsky120    schedule 05.04.2013    source источник


Ответы (1)


Поскольку ваш Document моделирует иерархическую структуру, вам нужно дерево. Поскольку для вашего интерфейса требуется как элемент управления, так и представление для каждого узла, вам нужна таблица. Outline, который можно увидеть здесь, может быть подходящим выбором. Ваш DocumentTreeModel будет содержать ссылку на корень документа Element, так же как FileTreeModel в примере содержит ссылку на корень File. Ваш RowModel будет включать JLabel, JCheckBox и JTextArea.

person trashgod    schedule 06.04.2013
comment
Мне нужно, чтобы внешний вид моей программы был точно таким же, как на картинке, поэтому это не сработает... - person Karlovsky120; 07.04.2013
comment
Извините, я не знаю более близкого представления Document. - person trashgod; 07.04.2013
comment
Я не обязательно ищу альтернативный вид, поскольку я ищу решение проблемы рекурсивного изменения размера графического интерфейса... - person Karlovsky120; 07.04.2013