Каскадное и мозаичное расположение фреймов Java

Каскадное и мозаичное расположение фреймов JavaВ операционной системе Windows предусмотрено несколько команд для организации каскадного(cascading) расположения фреймов с перекрытием(см. рис. 1) и мозаичного(tiling) расположения фреймов безе перекрытия(см. рис. 2). Однако в классах JDesktopPane и JInternalFrame не предусмотрено никаких средств для поддержки этих операций. В программе которая находится в конце статьи показано, как можно самостоятельно организовать такое упорядочение фреймов.

Для каскадного расположения нужно указать для фреймов одинаковый размер и указывать их позиции с одинаковым шагом.

Каскадное и мозаичное расположение фреймов JavaРис. 1. Каскадное расположение фреймов

Каскадное и мозаичное расположение фреймов JavaРис. 2. Мозаичное расположение фреймов

Для получения массива всех внутренних фреймов используется метод getAllFrames() класса JDesktopPane:

Однако при этом нужно учитывать текущее состояние фрейма, которое может быть таким:

  • пиктограмма, то есть фрейм полностью свернут;
  • фрейм имеет обычные размеры и допускает их изменение;
  • фрейм полностью развернут.

Для поиска полностью свернутых фреймов, которые нужно пропустить, следует применять метод isIcon(). Для полностью развернутых фреймов нужно задать их обычный размер с помощью метода setMaximum(false). На изменение этого свойства также может быть наложен запрет, следовательно, необходимо организовать перехват исключения PropertyVetoException.

Ниже представлен цикл перебора всех внутренних фреймов панели рабочего стола:

Мозаичное расположение фреймов организовать гораздо сложнее, особенно если количество фреймов таково, что они не образуют в точности квадратную решетку. Сначала необходимо подсчитать количество несвернутых фреймов, а затем определить количество строк мозаики:

После этого определяется количество столбцов за исключением последнего:

Последний незаполненный столбец выявляется так:

Ниже представлен цикл перебора всех внутренних фреймов рабочего стола, которые будут расположены в виде мозаики:

В программе, которая будет рассмотрена далее, показана еще одна распространенная операция: перемещение выбора от текущего фрейма к следующему несвернутому фрейму. Нужно вручную организовать обход всех фреймов и вызов метода isSelected() до тех пор, пока не будет найден текущий выбранный фрейм. Затем нужно найти следующий несвернутый фрейм и попытаться выбрать его с помощью приведенного ниже метода:

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

Код всей программы: