Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Используя Компоненты Swing
Раздел: Как Использовать Различные Компоненты
Как Использовать Разделенные области
Домашняя страница > Создание GUI С JFC/Swing > Используя Компоненты Swing

Как Использовать Разделенные области

A JSplitPane дисплеи два компонента, или рядом или один сверху другого. Перетаскивая делитель, который появляется между компонентами, пользователь может определить, сколько из общей площади разделенной области идет в каждый компонент. Можно разделить экранное пространство среди трех или больше компонентов, вставляя разделенные области разделенных областей, как описано в Разделенных областях Вложения.

Если Вы хотите создать разделенную область с произвольным числом компонентов, следует проверить статью Ганса Мюллера, MultiSplitPane: Разделение Без Вложения.

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

Вот изображение приложения, которое использует разделенную область, чтобы вывести на экран список и изображение рядом:

Снимок SplitPaneDemo

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, SplitPaneDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример SplitPaneDemo
  2. Перетащите покрытую ямочками строку, которая делит список и изображение налево или право. Попытайтесь перетащить делитель полностью к краю окна.
  3. Щелкните по крошечным стрелкам по делителю, чтобы скрыться/расшириться левый или правый компонент.

Ниже код от SplitPaneDemo это создает и устанавливает разделенную область.

//Create a split pane with the two scroll panes in it.
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                           listScrollPane, pictureScrollPane);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(150);

//Provide minimum sizes for the two components in the split pane
Dimension minimumSize = new Dimension(100, 50);
listScrollPane.setMinimumSize(minimumSize);
pictureScrollPane.setMinimumSize(minimumSize);

Конструктор, используемый этим примером, берет три параметра. Первое указывает на направление разделения. Другими параметрами являются эти два компонента, чтобы вставить разделенную область. Обратитесь к Установке Компонентов в Разделенной области для информации о JSplitPane методы, которые устанавливают компоненты динамически.

Разделенная область в этом примере разделяется горизонтально — эти два компонента появляются рядом — как определено JSplitPane.HORIZONTAL_SPLIT параметр конструктору. Разделенная область предоставляет одну другую возможность, определенную с JSplitPane.VERTICAL_SPLIT, это помещает один компонент выше другого. Можно изменить направление разделения после того, как разделенная область была создана с setOrientation метод.

Две маленьких стрелки появляются наверху делителя в разделенной области примера. Эти стрелки, которым позволяют пользователь выйти из строя (и затем развернуть) любой из компонентов одним щелчком. Текущий стиль определяет, появляются ли эти средства управления по умолчанию. В стили Java они выключаются по умолчанию. (Отметьте, что не весь взгляд и чувства поддерживают это.) Пример, превращенный их при использовании setOneTouchExpandable метод.

Диапазон делителя разделенной области определяется частично минимальными размерами компонентов в пределах разделенной области. См. Расположение Делителя и Ограничение его Диапазона для деталей.

Остальная часть этого раздела затрагивает эти темы:

Установка Компонентов в Разделенной области

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

Можно использовать любой из этих методов в любое время независимо от текущего направления разделения разделенной области. Звонки setLeftComponent и setTopComponent эквивалентны и устанавливает указанный компонент в главной или левой позиции, в зависимости от текущей ориентации разделения разделенной области. Точно так же звонки setRightComponent и setBottomComponent эквивалентны. Эта замена методов любой компонент уже находится в той позиции с новой.

Как другие контейнеры, JSplitPane поддерживает add метод. Разделенная область помещает первый компонент, добавленный в покинутых или ключевую позицию. Опасность использовать add это, Вы можете inadvertantly вызывать это слишком много раз, когда менеджер по расположению разделенной области выдаст довольно тайно выглядящее исключение. Если Вы используете add метод и разделенная область уже заполняются, Вы сначала должны удалить существующие компоненты с remove.

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

Расположение Делителя и Ограничение Его Диапазона

Чтобы заставить Вашу разделенную область работать хорошо, Вы часто должны устанавливать минимальные размеры компонентов в разделенной области, так же как привилегированный размер или разделенной области или ее содержавших компонентов. Выбор, какие размеры следует установить, является искусством, которое требует понимания, как определяются привилегированный размер разделенной области и расположение делителя. Прежде, чем мы войдем в детали, давайте бросим другой взгляд на SplitPaneDemo. Или, если Вы спешите, можно пропустить к списку правил.


Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, SplitPaneDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример SplitPaneDemo

    Поскольку размер фрейма демонстрационного примера устанавливается, используя pack метод, разделенная область в ее привилегированном размере, который SplitPaneDemo, оказывается, устанавливает явно. Делитель автоматически помещается так, чтобы левый компонент был в его привилегированном width, и все остающееся пространство идет в правильный компонент.
  2. Сделайте окно шире.
    Делитель остается, где это, и дополнительное пространство идет в компонент в праве.
  3. Сделайте окно заметно более узким чем тогда, когда оно сначала подходило — возможно, дважды столь же широкий как левый компонент.
    Снова, размер левого компонента и позиция делителя остаются то же самое. Только размер правильных компонентных изменений.
  4. Сделайте окно настолько узким насколько возможно.
    Принятие окна использует Java, обеспеченный стилем художественные оформления, невозможно измерить окно, меньшее чем минимальный размер разделенной области, который определяется минимальным размером компонентов, содержавших разделенной областью. SplitPaneDemo устанавливает минимальный размер этих содержавших компонентов явно.
  5. Сделайте окно шире, и затем перетащите делитель, насколько это пойдет направо.
    Делитель идет только, насколько минимальный размер правильного компонента позволяет. Если Вы перетащите делитель налево, то Вы будете видеть, что он также уважает минимальный размер левого компонента.

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

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

Разделенная область изменяет размеры веса, имеет значение между 0.0 и 1.0 и определяет, как пространство распределяется между двумя содержавшими компонентами, когда размер разделенной области устанавливается — или программно или пользователем, изменяющим размеры разделенной области (увеличение ее содержания окна, например). Изменять размеры вес разделенной области 0.0 по умолчанию, указывая, что покинутые или размер главного компонента фиксируются, и компонент права или нижней части корректирует свой размер, чтобы соответствовать остающемуся пространству. Установка изменять размеры вес к 0.5 разделениям любое дополнительное или недостающее пространство равномерно между этими двумя компонентами. Установка изменять размеры вес к 1.0 делает право или нижний компонентный размер, остается фиксированной. Изменять размеры вес не имеет никакого эффекта, однако, когда пользователь перетаскивает делитель.

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

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

Следующий снимок показывает пример под названием SplitPaneDividerDemo, который демонстрирует компонентные размеры разделенной области и размещение делителя.

Снимок SplitPaneDividerDemo

Как SplitPaneDemo, SplitPaneDividerDemo обладает горизонтальной разделенной областью с кнопками с одним касанием. У SplitPaneDividerDemo есть следующие дополнительные функции:


Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, SplitPaneDividerDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример SplitPaneDividerDemo

    Поскольку размер фрейма демонстрационного примера устанавливается, используя pack метод, разделенная область в ее привилегированном размере, который по умолчанию является только достаточно большим для SizeDisplayers, чтобы быть в их привилегированных размерах. Привилегированный размер каждого SizeDisplayer обозначается красным прямоугольником. Делитель автоматически помещается так, чтобы оба компонента были в их привилегированных ширинах.
  2. Сделайте окно шире.
    Поскольку разделенная область изменяет размеры веса, 0.5, дополнительное пространство делится равномерно между левыми и правыми компонентами. Делитель перемещается соответственно.
  3. Сделайте окно настолько узким насколько возможно.
    Принятие окна использует Java, обеспеченный стилем художественные оформления, это не будет позволять Вам измерять окно, меньшее чем минимальный размер разделенной области, который определяется минимальным размером SizeDisplayers это содержит. Минимальный размер каждого SizeDisplayer обозначается ярким синим прямоугольником.
  4. Сделайте окно немного шире, и затем перетащите делитель, насколько это пойдет направо.
    Делитель идет только, насколько минимальный размер правильного компонента позволяет.
  5. После удостоверения разделенной области меньше чем ее привилегированный размер, щелкните по Кнопке сброса.
    Отметьте что два SizeDisplayers выводятся на экран в различных размерах, даже при том, что, когда приложение подходило, у них были равные размеры. Причина состоит в том, что, хотя их привилегированные размеры равны, их минимальные размеры не. Поскольку разделенная область не может вывести на экран их в их привилегированных размерах или больше, она кладет их использование их минимальных размеров. Оставшееся пространство делится одинаково между компонентами, так как разделенная область изменяет размеры веса, 0.5.
  6. Расширьте разделенную область так, чтобы это было достаточно большим для обоих SizeDisplayers, чтобы быть показанными в их привилегированных размерах, и затем щелкают по Кнопке сброса.
    Делитель помещается в середине снова, так, чтобы оба компонента были тем же самым размером.

Вот код, который создает GUI для SplitPaneDividerDemo:

public class SplitPaneDividerDemo extends JPanel ... {

    private JSplitPane splitPane;
   
    public SplitPaneDividerDemo() {
        super(new BorderLayout());

        Font font = new Font("Serif", Font.ITALIC, 24);

        ImageIcon icon = createImageIcon("images/Cat.gif");
        SizeDisplayer sd1 = new SizeDisplayer("left", icon);
        sd1.setMinimumSize(new Dimension(30,30));
        sd1.setFont(font);
        
        icon = createImageIcon("images/Dog.gif");
        SizeDisplayer sd2 = new SizeDisplayer("right", icon);
        sd2.setMinimumSize(new Dimension(60,60));
        sd2.setFont(font);
        
        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                                   sd1, sd2);
        splitPane.setResizeWeight(0.5);
        splitPane.setOneTouchExpandable(true);
        splitPane.setContinuousLayout(true);

        add(splitPane, BorderLayout.CENTER);
        add(createControlPanel(), BorderLayout.PAGE_END);
    }
    ...
}

Код справедливо сам объяснительный, кроме, возможно, для звонка setContinuousLayout. Установка continuousLayout свойства к истине заставляет содержание разделенной области быть нарисованным непрерывно, в то время как пользователь перемещает делитель. Непрерывное расположение не включено, по умолчанию, потому что оно может оказать отрицательное влияние производительности. Однако, имеет смысл использовать это в этом демонстрационном примере, когда наличие компонентов разделенной области, настолько актуальных насколько возможно, может улучшить пользовательский опыт.

Разделенные области вложения

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

Снимок SplitPaneDemo2

Если главная часть разделенной области выглядит знакомой Вам, это - потому что программа помещает разделенную область, создаваемую SplitPaneDemo во второй разделенной области. Простое JLabel другой компонент во второй разделенной области. Это не наиболее практическое применение вложенной разделенной области, но оно понимает через.

Запускает пример SplitPaneDemo2

Вот интересная часть кода, в котором можно найти SplitPaneDemo2.java:

//Create an instance of SplitPaneDemo
SplitPaneDemo splitPaneDemo = new SplitPaneDemo();
JSplitPane top = splitPaneDemo.getSplitPane();

...
//Create a regular old label
label = new JLabel("Click on an image name in the list.",
                   JLabel.CENTER);

//Create a split pane and put "top" (a split pane)
//and JLabel instance in it.
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
                                      top, label);

Обратитесь к Решению Общих Компонентных проблем для информации о решении проблемы границы, которая может появиться когда разделенные области вложения.

API Разделенной области

Следующие таблицы приводят обычно используемый JSplitPane конструкторы и методы. Другие методы Вы, наиболее вероятно, вызовете на a JSplitPane объект - те такой как setPreferredSize то, что его суперклассы обеспечивают. См. API JComponent для таблиц обычно используемых наследованных методов.

API для того, чтобы использовать списки попадает в эти категории:

Установка Разделенной области
Метод или Конструктор Цель
JSplitPane ()
JSplitPane (интервал)
JSplitPane (интервал, булев)
JSplitPane (интервал, Компонент, Компонент)
JSplitPane (интервал, булев, Компонент, Компонент)
Создайте разделенную область. Когда существующий, int параметр указывает на ориентацию разделенной области, также HORIZONTAL_SPLIT (значение по умолчанию) или VERTICAL_SPLIT. boolean параметр, когда существующий, устанавливает, перекрашивают ли компоненты непрерывно, поскольку пользователь перетаскивает разделенную область. Если оставлено неуказанный, эта опция (названный непрерывным расположением) выключается. Component набор параметров левая и правая начальная буква, или вершина и нижние компоненты, соответственно.
освободите setOrientation (интервал)
интервал getOrientation ()
Набор или получает ориентацию разделенной области. Используйте также HORIZONTAL_SPLIT или VERTICAL_SPLIT определенный в JSplitPane. Если оставлено неуказанный, разделенная область будет горизонтально разделена.
освободите setDividerSize (интервал)
интервал getDividerSize ()
Набор или получает размер делителя в пикселях.
освободите (булев) setContinuousLayout
булев isContinuousLayout ()
Набор или добирается, являются ли компоненты разделенной области непрерывно layed и нарисованный, в то время как пользователь перетаскивает делитель. По умолчанию непрерывное расположение выключается.
освободите (булев) setOneTouchExpandable
булев isOneTouchExpandable ()
Набор или добирается, выводит ли разделенная область на экран управление на делителе, чтобы расшириться/выйти из строя делитель. Значение по умолчанию зависит от стили. В стили Java это прочь по умолчанию.
Управление Содержанием Разделенной области
Метод Цель
освободите setTopComponent (Компонент)
освободите setBottomComponent (Компонент)
освободите setLeftComponent (Компонент)
освободите setRightComponent (Компонент)
Компонент getTopComponent ()
Компонент getBottomComponent ()
Компонент getLeftComponent ()
Компонент getRightComponent ()
Набор или получает обозначенный компонент. Каждый метод работает независимо от ориентации разделенной области. Вершина и оставленный эквивалентна, и нижняя часть и право эквивалентны.
пусто удалите (Компонент)
освободите removeAll ()
Удалите обозначенный компонент (ы) из разделенной области.
пусто добавьте (Компонент) Добавьте компонент к разделенной области. Можно добавить только два компонента к разделенной области. Первый добавленный компонент является главным/левым компонентом. Второй добавленный компонент является компонентом нижней части/права. Любая попытка добавить больше компонентов приводит к исключению.
Расположение Делителя
Метод Цель
освободите (двойной) setDividerLocation
освободите setDividerLocation (интервал)
интервал getDividerLocation ()
Набор или получает текущее расположение делителя. Устанавливая расположение делителя, можно определить новое расположение как процент (double) или пиксельное расположение (int).
освободите resetToPreferredSizes () Переместите делитель так, что, оба компонента в их привилегированных размерах. Это - то, как разделенная область делит себя при запуске, если не определено иначе.
освободите setLastDividerLocation (интервал)
интервал getLastDividerLocation ()
Набор или получает предыдущую позицию делителя.
интервал getMaximumDividerLocation ()
интервал getMinimumDividerLocation ()
Получите минимальные и максимальные расположения для делителя. Они устанавливаются неявно, устанавливая минимальные размеры двух компонентов разделенной области.
освободите setResizeWeight (плавание)
пустите в ход getResizeWeight ()
Набор или получает изменять размеры вес для разделенной области, значения между 0.0 (значение по умолчанию) и 1.0. См. Расположение Делителя и Ограничение Его Диапазона для объяснения и примеров использования изменять размеры веса.

Примеры то Использование Разделенные области

Эта таблица показывает некоторые примеры то использование JSplitPane и где те примеры описываются.

Пример Где Описано Примечания
SplitPaneDemo Эта страница и Как Использовать Списки Показывает разделенную область с горизонтальным разделением.
SplitPaneDividerDemo Эта страница Демонстрирует, как компонентная информация о размере и изменяет размеры веса, используются, чтобы расположить делитель.
SplitPaneDemo2 Эта страница Помещает разделенную область в пределах разделенной области, чтобы создать разделение с тремя путями.
TreeDemo Как Использовать Деревья Использует разделенную область с вертикальным разделением, чтобы разделить дерево (в области прокрутки) от области редактора (в области прокрутки). Не использует расширяемую функцию с одним касанием.
TextComponentDemo Текстовые Компонентные Функции Использует разделенную область с вертикальным разделением, чтобы разделить текстовую область и текстовую область, обоих в областях прокрутки.
TextSamplerDemo Текстовые Компонентные Функции Использует разделенную область с вертикальным разделением, и измените размеры веса 0.5, чтобы разделить текстовую область и область редактора, обоих в областях прокрутки. Разделенная область находится в правильной половине контейнера, у которого есть справедливо сложное расположение. Менеджеры по расположению такой как GridLayout и BorderLayout используются, наряду с разделенной областью изменяют размеры веса, чтобы гарантировать, что компоненты в областях прокрутки совместно используют все дополнительное пространство.
ListSelectionDemo Как Записать Слушателю Выбора Списка Использует разделенную область с вертикальным разделением, чтобы разделить верхнюю область, содержа список и таблицу (оба в областях прокрутки), от более низкой области, которая содержит поле комбинированного списка выше области прокрутки. Более низкая область использует расположение границы, чтобы сохранить поле комбинированного списка маленьким и область прокрутки жадный для пространства.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Использовать Прядильщиков
Следующая страница: Как Использовать Снабженные вкладками Области