Swing: проблема различения пользовательского и автоматического изменения размера компонентов (написание собственного LayoutManager) - PullRequest
1 голос
/ 30 мая 2009

Я пытаюсь написать собственный менеджер макетов .

Компоненты должны быть размещены и иметь размеры относительно друг к другу.
Это означает: когда пользователь перетаскивает или изменяет размер компонента, некоторые другие компоненты (но не , которые были изменены пользователем вручную) должны быть изменены.

Swing говорит менеджеру по расположению размещать компоненты каждый раз, когда некоторые из них перемещены / изменены. Это проблема, следовательно, макет менеджер сам перемещает / изменяет размеры компонентов:
Не получается, метод layoutContainer (родительский контейнер) вызывается несколько раз.

пример всего этого (упрощенно, фактически мой менеджер раскладки делает более сложные вещи):

  • [-component1-][-component2-------][-component3-]
  • пользователь изменяет размер компонента2, чтобы он стал меньше другие компоненты, чтобы все они занимали то же пространство, что и раньше:
    [-component1-][-component2-][-component3-------]
  • здесь действия должны прекратиться , но они продолжаются: теперь менеджер раскладки вызывается из-за изменения размера компонента3

Как я мог достичь своего намерения (элегантным способом)?
Спасибо.

EDIT:
Удалена информация, связанная с потоками, после предложений от ответчиков.

Ответы [ 3 ]

2 голосов
/ 30 мая 2009

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

1 голос
/ 30 мая 2009

Это не проблема синхронизации потоков.

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

Конечно, это всего лишь предположение, без проверки вашего кода.

0 голосов
/ 30 мая 2009

Я не могу говорить с правильной реализацией менеджера компоновки, но что касается потоков, то все события в Swing отправляются в поток пользовательского интерфейса Swing, то есть в тот же поток. Таким образом, синхронизация объектов не будет иметь никакого эффекта, потому что вовлекается только один поток. Вы можете увидеть, какой поток вызывает метод, напечатав Thread.currentThread() или проверив его в отладчике.

В зависимости от того, что вы пытаетесь сделать, вы можете взглянуть на miglayout . Я нашел его очень мощным и простым в использовании. Правильная реализация менеджера компоновки Swing - нетривиальная задача.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...