След: Создание GUI С JFC/Swing
Урок: Используя Компоненты Swing
Раздел: Как Использовать Различные Компоненты
Как Использовать Внутренние рамки
Домашняя страница > Создание GUI С JFC/Swing > Используя Компоненты Swing

Как Использовать Внутренние рамки

С JInternalFrame class можно вывести на экран a JFrame- как окно в пределах другого окна. Обычно, Вы добавляете внутренние рамки к настольной области. Настольная область, поочередно, могла бы использоваться в качестве области контента a JFrame. Настольная область является экземпляром JDesktopPane, который является подклассом JLayeredPane это добавило API для того, чтобы управлять многократными внутренними рамками наложения.

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

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

У InternalFrameDemo есть многократные внутренние рамки, которыми управляет настольная область

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, InternalFrameDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает пример InternalFrameDemo
  2. Создайте новые внутренние рамки, используя Создать элемент в меню Document.
    Каждая внутренняя рамка подходит 30 пикселей ниже и направо от места, где предыдущая внутренняя рамка сначала появилась. Эта функциональность реализуется в MyInternalFrame class, который является пользовательским подклассом JInternalFrame.

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

...//In the constructor of InternalFrameDemo, a JFrame subclass:
    desktop = new JDesktopPane();
    createFrame(); //Create first window
    setContentPane(desktop);
    ...
    //Make dragging a little faster but perhaps uglier.
    desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
...
protected void createFrame() {
    MyInternalFrame frame = new MyInternalFrame();
    frame.setVisible(true);
    desktop.add(frame);
    try {
        frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e) {}
}

...//In the constructor of MyInternalFrame, a JInternalFrame subclass:
static int openFrameCount = 0;
static final int xOffset = 30, yOffset = 30;

public MyInternalFrame() {
    super("Document #" + (++openFrameCount),
          true, //resizable
          true, //closable
          true, //maximizable
          true);//iconifiable
    //...Create the GUI and put it in the window...
    //...Then set the window size or call pack...
    ...
    //Set the window's location.
    setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
}

Внутренние рамки по сравнению с Регулярными Фреймами

Код для того, чтобы использовать внутренние рамки подобен разными способами коду для того, чтобы использовать регулярные фреймы Swing. Поскольку у внутренних рамок есть корневые области, устанавливая GUI для a JInternalFrame очень подобно установке GUI для a JFrame. JInternalFrame также обеспечивает другой API, такой как pack, это делает это подобным JFrame.


Отметьте: 

Так же, как для регулярного фрейма, следует вызвать setVisible(true) или show() на внутренней рамке, чтобы вывести на экран это. Внутренняя рамка не появляется, пока Вы явно не делаете ее видимой.


Внутренние рамки не являются окнами или высокоуровневыми контейнерами, однако, который делает их отличающимися от фреймов. Например, следует добавить внутреннюю рамку к контейнеру (обычно a JDesktopPane); внутренняя рамка не может быть корнем иерархии включения. Кроме того, внутренние рамки не генерируют события окна. Вместо этого пользовательские действия, которые заставили бы фрейм запускать события окна, заставляют внутреннюю рамку запускать события внутренней рамки.

Поскольку внутренние рамки реализуются с независимым от платформы кодом, они добавляют некоторые опции, которые фреймы не могут дать Вам. Одна такая функция - то, что внутренние рамки дают Вам больше контроля своим состоянием и возможностями, чем фреймы. Вы можете programatically представлять в виде значка или максимизировать внутреннюю рамку. Можно также определить, какой значок входит в панель title внутренней рамки. Можно даже определить, есть ли у внутренней рамки художественные оформления окна, чтобы поддерживать изменение размеров, представление в виде значка, закрытие, и максимизацию.

Другая функция - то, что внутренние рамки разрабатываются, чтобы работать в пределах настольных областей. JInternalFrame API содержит методы такой как moveToFront та работа, только если контейнер внутренней рамки является многоуровневой областью, такой как a JDesktopPane.

Правила Использования Внутренних рамок

Если Вы создали какое-либо использование программ JFrame и другие компоненты Swing, тогда Вы уже знаете много о том, как использовать внутренние рамки. Следующий список суммирует правила для того, чтобы использовать внутренние рамки. Для дополнительной информации см., Как Сделать Фреймы и Класс JComponent.

Следует установить размер внутренней рамки.
Если Вы не установите размер внутренней рамки, то он будет иметь нулевой размер и таким образом никогда не видим. Можно установить размер, используя один из следующих методов: setSize, pack, или setBounds.
Как правило следует установить расположение внутренней рамки.
Если Вы не установите расположение внутренней рамки, то оно подойдет в 0,0 (верхний левый из ее контейнера). Можно использовать setLocation или setBounds метод, чтобы определить верхнюю левую точку внутренней рамки, относительно ее контейнера.
Чтобы добавить компоненты к внутренней рамке, Вы добавляете их к области контента внутренней рамки.
Это точно походит JFrame ситуация. См. Добавляющие Компоненты к Области Контента для деталей.
Диалоговые окна, которые являются внутренними рамками, должны быть реализованы, используя JOptionPane или JInternalFrame, нет JDialog.
Чтобы создать простое диалоговое окно, можно использовать JOptionPane showInternalXxxDialog методы, как описано в том, Как Сделать Диалоговые окна.
Следует добавить внутреннюю рамку к контейнеру.
Если Вы не добавляете внутреннюю рамку к контейнеру (обычно a JDesktopPane), внутренняя рамка не будет появляться.
Вы должны вызвать show или setVisible на внутренних рамках.
Внутренние рамки невидимы по умолчанию. Следует вызвать setVisible(true) или show() сделать их видимыми.
Внутренние рамки запускают события внутренней рамки, не события окна.
Обработка событий внутренней рамки почти идентична обработке событий окна. См., Как Записать Слушателю Внутренней рамки для получения дополнительной информации.


Подсказка по производительности: 

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

Используйте JDesktopPane метод setDragMode*, чтобы определить перетаскивание схемы. Например:

desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);

API Внутренней рамки

Следующие таблицы приводят обычно используемый JInternalFrame конструкторы и методы, так же как несколько методов это JDesktopPane обеспечивает. Помимо API, перечисленного в этом разделе, JInternalFrame наследовал полезный API от его суперклассов, JComponent, Component, и Container. См. Класс JComponent для списков методов от тех классов.

Как JInternalFrame, JDesktopPane убывает от JComponent, и таким образом обеспечивает методы, описанные в Классе JComponent. Поскольку JDesktopPane расширяется JLayeredPane, это также поддерживает методы, описанные в Многоуровневом API Области.

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

Создание Внутренней рамки
Конструктор или Метод Цель
JInternalFrame ()
JInternalFrame (Строка)
JInternalFrame (Строка, булева)
JInternalFrame (Строка, булева, булева)
JInternalFrame (Строка, булева, булева, булева)
JInternalFrame (Строка, булева, булева, булева, булева)
Создайте a JInternalFrame экземпляр. Первый параметр определяет title (если любой), чтобы быть выведенным на экран внутренней рамкой. Остальная часть параметров определяет, должна ли внутренняя рамка содержать художественные оформления, разрешающие пользователю изменять размеры, закрывать, максимизировать, и представлять внутреннюю рамку в виде значка (определенный в том порядке). Значение по умолчанию для каждого булева параметра false, что означает, что работа не позволяется.
статический интервал showInternalConfirmDialog (Компонент, Объект)
статическая Строка showInternalInputDialog (Компонент, Объект)
статический Объект showInternalMessageDialog (Компонент, Объект)
статический интервал showInternalOptionDialog (Компонент, Объект, Строка, интервал, интервал, Значок, Объект [], Объект)
Создайте a JInternalFrame это моделирует диалоговое окно. См., Как Сделать Диалоговые окна для деталей.
Добавление Компонентов к Внутренней рамке
Метод Цель
освободите setContentPane (Контейнер)
Контейнер getContentPane ()
Набор или получает область контента внутренней рамки, которая обычно содержит весь GUI внутренней рамки, за исключением художественных оформлений окна и строки меню.
освободите setJMenuBar (JMenuBar)
JMenuBar getJMenuBar ()
Набор или получает строку меню внутренней рамки.
освободите setLayeredPane (JLayeredPane)
JLayeredPane getLayeredPane ()
Набор или получает многоуровневую область внутренней рамки.
Определяя Видимость Внутренней рамки, Размер, и Расположение
Метод Цель
освободите (булев) setVisible Сделайте внутреннюю рамку видимой (если true) или невидимый (если false). Следует вызвать setVisible(true) на каждом JInternalFrame прежде, чем добавить это к его контейнеру. (Наследованный от Component).
освободите пакет () Измерьте внутреннюю рамку так, чтобы ее компоненты были в их привилегированных размерах.
освободите setLocation (Точка)
освободите setLocation (интервал, интервал)
Установите позицию внутренней рамки. (Наследованный от Component).
освободите setBounds (Прямоугольник)
освободите setBounds (интервал, интервал, интервал, интервал)
Явно установите размер и расположение внутренней рамки. (Наследованный от Component).
освободите setSize (Размерность)
освободите setSize (интервал, интервал)
Явно установите размер внутренней рамки. (Наследованный от Component).
Выполнение Операций Окна на Внутренней рамке
Метод Цель
освободите setDefaultCloseOperation (интервал)
интервал getDefaultCloseOperation ()
Набор или получает то, что делает внутренняя рамка, когда пользователь пытается "закрыть" внутреннюю рамку. Значение по умолчанию DISPOSE_ON_CLOSE. Другие возможные значения DO_NOTHING_ON_CLOSE и HIDE_ON_CLOSE См. Отвечающие Закрывающие окно События для деталей.
освободите addInternalFrameListener (InternalFrameListener)
освободите removeInternalFrameListener (InternalFrameListener)
Добавьте или удалите слушателя внутренней рамки (JInternalFrame's эквивалентный из слушателя окна). См., Как Записать Слушателю Внутренней рамки для получения дополнительной информации.
освободите moveToFront ()
освободите moveToBack ()
Если родитель внутренней рамки является многоуровневой областью, такой как настольная область, перемещает внутреннюю рамку в переднюю сторону или назад (соответственно) ее уровня.
освободите (булев) setClosed
булев isClosed ()
Набор или добирается, закрывается ли внутренняя рамка в настоящий момент. Параметр setClosed должен быть true. Вновь открывая закрытую внутреннюю рамку, Вы делаете это видимым и добавляете это к контейнеру (обычно настольная область, Вы первоначально добавили это к).
освободите (булев) setIcon
булев isIcon ()
Представьте в виде значка или deiconify внутренняя рамка, или определите, представляется ли это в настоящий момент в виде значка.
освободите (булев) setMaximum
булев isMaximum ()
Максимизируйте или восстановите внутреннюю рамку, или определите, максимизируется ли она.
освободите (булев) setSelected
булев isSelected ()
Набор или добирается, является ли внутренняя рамка в настоящий момент "выбранной" (активированной) внутренней рамкой.
Управление Художественными оформлениями Окна и Возможностями
Метод Цель
освободите setFrameIcon (Значок)
Значок getFrameIcon ()
Набор или вывел на экран значок в панели title внутренней рамки (обычно в верхнем левом углу).
освободите (булев) setClosable
булев isClosable ()
Набор или добирается, может ли пользователь закрыть внутреннюю рамку.
освободите (булев) setIconifiable
булев isIconifiable ()
Набор или добирается, может ли внутренняя рамка быть представлена в виде значка.
освободите (булев) setMaximizable
булев isMaximizable ()
Набор или добирается, может ли пользователь максимизировать эту внутреннюю рамку.
освободите (булев) setResizable
булев isResizable ()
Набор или добирается, может ли внутренняя рамка быть изменена.
освободите setTitle (Строка)
Представьте getTitle в виде строки ()
Набор или получает окно title.
Используя JDesktopPane API
Конструктор или Метод Цель
JDesktopPane () Создает новый экземпляр JDesktopPane.
JInternalFrame [] getAllFrames () Возвраты все JInternalFrame объекты, которые содержит рабочий стол.
JInternalFrame [] getAllFramesInLayer (интервал) Возвраты все JInternalFrame объекты, которые содержит рабочий стол, которые находятся в указанном уровне. См., Как Использовать Многоуровневые Области для информации об уровнях.
освободите setDragMode (интервал)
интервал getDragMode ()
Набор или получает перетащить режим, используемый для внутренних рамок в этом рабочем столе. Целое число может быть также JDesktopPane.LIVE_DRAG_MODE или JDesktopPane.OUTLINE_DRAG_MODE. Значение по умолчанию для стили Java живо - перетаскивают режим.

Примеры то Использование Внутренние рамки

Следующие примеры используют внутренние рамки. Поскольку внутренние рамки подобны регулярным фреймам, следует также смотреть на Примеры то Использование Фреймы.

Пример Где Описано Примечания
MyInternalFrame Эта страница. Реализует внутреннюю рамку, которая появляется при смещении к ранее создаваемой внутренней рамке.
InternalFrameDemo Эта страница. Позволяет Вам создавать внутренние рамки (экземпляры MyInternalFrame) это входит в приложение JDesktopPane.
InternalFrameEventDemo Как Записать Слушателю Внутренней рамки Демонстрирует, как прислушиваться к событиям внутренней рамки. Также демонстрирует, как располагать внутренние рамки в пределах настольной области.

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

Предыдущая страница: Как Сделать Фреймы (Главные окна)
Следующая страница: Как Использовать Метки