Отказ от ответственности: я новичок в свинге.
TLDR: я динамически добавляю панели JPanel к «окружающей» панели JPanel с помощью кнопки. Все панели используют MiGLayout. Внешняя панель содержит только одну ячейку, и по мере добавления внутренних панелей создается больше строк сверху вниз (ограничение «плавность»). Внутренние панели состоят из двух рядов, но второй раскрывается динамически (ограничение макета «hidemode 3» с setVisible(false)
до тех пор, пока не будет выполнено условие).
Что происходит, так это то, что при добавлении внутренней панели и отображении ее второй строки она перекрывается с панелью под ней. Я пытался вызвать перепроверку и перерисовку везде, где это возможно. Мне кажется, что внешняя/окружающая панель просто должна перепроверить свои дочерние компоненты, но, похоже, этого не происходит.
Задний план
Я использую MiGLayout и Swing для создания графического интерфейса для импорта в мою базу данных. Пользователи должны иметь возможность нажать кнопку, которая добавляет панели к закрывающей панели. В частности, [рассматриваемая часть] графического интерфейса состоит из...
- объемлющий
JPanel
(черный), содержащий: JToolbar
(синий) иJScrollPane
(красный), у которого естьViewport
- другой
JPanel
(зеленый)
этот последний JPanel
, #4, является контейнером для динамически добавляемых панелей с помощью кнопки (см. второе изображение ниже).
Самая нижняя панель JPanel, №4, использует MiGLayout. Сама панель и содержащая ее область прокрутки скрыты от просмотра до тех пор, пока пользователь не нажмет кнопку рядом с выпадающим списком «Файл». (не показано на рисунке выше, так как это не было во время выполнения).
После нажатия на эту панель добавляется подкласс JPanel: (скриншот во время выполнения)
Панели укладываются друг на друга по мере добавления новых.
Эта внутренняя панель состоит из двух рядов, но второй ряд невидим и не влияет на макет, пока не станет видимым. Он становится видимым через слушателей, когда в текстовом поле выполняется условие.
Проблема
Если второй ряд внутренней панели становится видимым, он перекрывает панель в ряду под ним. Вот что я имею в виду....
Пользователь добавляет три панели:
Вторая панель вызывает setVisible(true)
, так что теперь состоит из двух строк, но скрывает третью панель:
Для драматического эффекта (то же время выполнения):
Проблема очевидна. Как предотвратить это совпадение?
В идеале я бы хотел, чтобы выходная панель реорганизовалась соответствующим образом, чтобы учесть больший размер.
Скажем, я добавляю одну панель, затем запускаю скрытую строку, ЗАТЕМ добавляю другую панель --- все еще есть перекрытие. Насколько я понял, revalidate()
должен позаботиться об этих вещах, но я звонил везде, где только можно (возможно, слишком часто, если возможно??), но безрезультатно..
Я пробовал много разных ограничений на закрывающей панели, а также на внутренних панелях, но безуспешно. Я пробовал как создать вторую строку, так и показать/скрыть ее динамически или просто создать ее динамически, но безуспешно. Он постоянно перекрывается одним и тем же образом, и я не могу заставить его переразметить эти внутренние панели.
Я могу придумать некоторые обходные пути, но это кажется возможным!
Мой самый длинный вопрос, извините за это. Любая помощь приветствуется. Спасибо.