410013796724260
• Webmoney
R335386147728
Z369087728698
JWindow, JFrame, JDialogОкна являются основой пользовательского интерфейса любой операционной системы. Они визуально разделяют выполняемые в среде приложения. Окна, используемые в библиотеке Swing, мало чем отличаются от окон библиотеки AWT, которые представляют собой окна операционной системы. Все окна библиотеки Swing — а к ним относятся окно без рамки JWindow, окно с рамкой JFrame и диалоговое окно JDialog — являются исключением из правила, согласно которому все компоненты Swing представляют собой легковесные компоненты и унаследованы от базового класса JComponent. Окна Swing являются тяжеловесными контейнерами для размещения в них легковесных компонентов, которые операционная система не видит. Наиболее полезные JFrame методы
Окно JWindow«Родителем» всех окон Swing является окно без рамки и без элементов управления JWindow. Класс JWindow представляет собой окно без рамки и без элементов управления, предназначенных, к примеру, для его закрытия или перемещения. Данный тип окна дает минимальные возможности по своей настройке, в отличие от чаще всего используемого окна JFrame. Окно без рамки не часто требуется в программах. Однако в отдельных случаях оно может быть полезно, особенно в тех случаях, когда необходимо ненадолго вывести на экран какую-либо информацию типа заставки программы или подсказку для пользователя, и управлять окном с этой информацией не нужно. Окна JWindow используются всплывающими меню JPopupMenu в тех ситуациях, когда в окне приложения не хватает места для размещения легковесного компонента в слое POPUP_LAYER многослойной панели, где всплывающие меню располагаются по умолчанию. В такой ситуации вместо легковесного компонента создается небольшое окно без рамки JWindow, которое можно разместить в любом месте экрана, потому что оно принадлежит операционной системе. В этом окне и размещается всплывающее меню. Рассмотрим пример JWindowTest. Основная идея использования окна без рамки JWindow заключается в копировании части "изображения рабочего стола" в окно приложения. Благодаря появившемуся в пакете JDK 1.3 классу Robot можно "снимать" экранную копию рабочего стола. Пример JWindow// Пример использования окна без рамки JWindow import javax.swing.*; import java.awt.*; // Класс прорисовки изображения class ImageDraw extends JComponent { private Image capture; ImageDraw (Image capture) { this.capture = capture; } public void paintComponent(Graphics g) { // Прорисовка изображения g.drawImage(capture, 0, 0, this); } } public class JWindowTest extends JWindow { // изображение "рабочего стола" private Image capture; // Размер окна private int window_w = 300, window_h = 300; public JWindowTest() { super(); // Определение положение окна на экране setLocation(200, 100); // Определение размера окна setSize (window_w, window_h); try { // "Вырезаем" часть изображения "рабочего стола" Robot robot = new Robot(); capture = robot.createScreenCapture( new Rectangle(5, 5, window_w, window_h)); } catch (Exception ex) { ex.printStackTrace(); } // Добавляем в интерфейс изображение getContentPane().add(new ImageDraw(capture)); // Открываем окно setVisible(true); try { // Заканчиваем работу через 10 сек Thread.currentThread(); Thread.sleep(10000); } catch (Exception e) { } System.exit(0); } public static void main(String[] args) { new JWindowTest(); } } В этом примере приложение наследуем от окна JWindow, чтобы удобнее вызывать методы этого класса и добавлять в окно компоненты. Объект Robot необходимо создавать в блоке try ... catch, т.к. его создание может быть запрещено менеджером безопасности, используемым виртуальной машиной Java. Впрочем, нам нарушение безопасности не грозит, потому что мы создаем отдельное приложение, а не апплет. Вырезаем часть изображения "рабочего стола" методом createScreenCapture() в стороне он местоположения нашего окна. Затем в панель содержимого окна добавляется компонент ImageDraw, который и отображает вырезанное изображения рабочего стола. После вывода окна на экран программа засыпает на 10 секунд, а потом заканчивает свою работу. Скриншот рабочего стола с интерфейсом окна примера JWindow представлен на следующем рисунке. Прежде чем производить настройку окна, в примере JWindowTest вызывается конструктор базового класса ключевым словом super() без параметров. На самом деле окна без рамки JWindow обязательно требуют при создании указывать своего «родителя» — окно с рамкой JFrame,что не всегда может быть неудобно. Специально для таких случаев в класс JWindow был добавлен конструктор без параметров, который создает вспомогательное невидимое окно JFrame и использует его как «родителя». После этого все окна без рамки, созданные таким образом, задействуют только это окно и экономят ресурсы. Следует также отметить, что с помощью конструктора без параметров создается окно JWindow, неспособное получать фокус ввода. Чаще всего именно такое поведение необходимо (ведь панелям инструментов, всплывающим заставкам и меню фокус ввода не нужен). При необходимости получения фокуса ввода, используйте метод setFocusableWindowState(true). Окно JFrameОкно JFrame наследует свойства класса JWindow и представляет собой наиболее часто используемое в приложениях окно «общего назначения». Основные отличия окна JFrame от JWindow :
Для размещения компонентов пользовательского интерфейса в подавляющем большинстве приложений применяется класс JFrame. Разработчики Swing определили специальный метод закрытия окна setDefaultCloseOperation, существенно упрощающий эту операцию. Рассмотрим простой JFrame пример (JFrameWindowListener) с обработкой события закрытия окна. JFrame примерimport java.awt.Dimension; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; import javax.swing.JLabel; public class JFrameWindowListener extends JFrame { private static final long serialVersionUID = 1L; private static int counter = 0; // счетчик private static JLabel label = null; private static String TEMPL = "Закрытие окна (попыток %d)"; public JFrameWindowListener () { // Создание окна с заголовком JFrame frame = new JFrame("JFrameWindowListener"); // Не закрывать окно по нажатию на кнопку с крестиком frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // Подключение слушателя окна frame.addWindowListener(new WindowListener() { public void windowActivated (WindowEvent event) {} public void windowClosed (WindowEvent event) {} public void windowDeactivated(WindowEvent event) {} public void windowDeiconified(WindowEvent event) {} public void windowIconified (WindowEvent event) {} public void windowOpened (WindowEvent event) {} // Метод обработки события "Закрытие окна" public void windowClosing (WindowEvent event) { if (++counter == 3) { event.getWindow().setVisible(false); System.exit(0); } else label.setText(String.format(TEMPL, counter)); } }); label = new JLabel(String.format(TEMPL, counter)); frame.getContentPane().add(label); frame.setPreferredSize(new Dimension(250, 80)); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { JFrame.setDefaultLookAndFeelDecorated(true); new JFrameWindowListener(); } } В примере создается окно JFrame с определением заголовка в конструкторе базового класса. Для определения титульной строки окна можно также использовать метод setTitle() класса JFrame. Прежде чем задать размеры окна и отобразить его на экране, вызывается метод setDefaultCloseOperation(). Данный метод позволяет указать, какое действие будет произведено при предварительной обработке события processWindowEvent() перед закрытием окна. По умолчанию используется константа HIDE_ON_CLOSE, убирающая окно с экрана при его закрытии. Можно использовать значение EXIT_ON_CLOSE, которое указывает, что при закрытии окна необходимо закончить работу приложения. В примере методу setDefaultCloseOperation передается константа DO_NOTHING_ON_CLOSE - ничего не делать при закрытии окна. К окну JFrame подключается слушатель и обработка события закрытия окна выполняется в методе windowClosing. Алгоритм обработки построен таким образом, что окно закрывается при третьей попытке. Номер попытки отображается в метке интерфейса. Скриншот рабочего стола с интерфейсом окна нашей программы представлен на следующем рисунке. Для определения иконки окна необходимо использовать метод setIconImage(). Иконка располагается на кнопке свернутого окна или в заголовке окна в нормальном состоянии. Из дополнительных возможностей окна с рамкой JFrame следует упомянуть о его способности «прятать» свои «украшения»: рамку и элементы управления окном. Делает это метод JWindow. События окон, WindowListener, WindowFocusListenerОкна Swing (JWindow, JFrame, JDialog) поддерживают два типа событий :
Полный список методов данных слушателей можно найти в интерактивной документации Java. В интерфейсе слушателя WindowListener чаще остальных применяют метод windowClosing, вызываемый системой событий при закрытии окна. Рассмотренный выше пример наглядно демонстрирует это. К фрейму JFrame можно подключить слушателя окна, созданного на основе WindowAdapter (чтобы не реализовывать все определенные в интерфейсе WindowListener методы) и переопределить метод windowClosing, как это представлено в следующих строках кода : // Добавляем слушателя событий от окна frame.addWindowListener (new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // Потверждение закрытия окна JFrame int res = JOptionPane.showConfirmDialog(null, "Выйти из программы?"); if (res == JOptionPane.YES_OPTION) System.exit(0); } }); При выходе из программы открывается диалоговое окно в панели JOptionPane и у пользователя спрашивается подтверждение, действительно ли он желает закончить работу с приложением. Если ответ положительный, то программа завершает работу. Диалоговое окно JDialogДиалоговые окна чаще всего используются в приложениях для получения дополнительной информации с целью установки параметров приложения, вывода важной вспомогательной/отладочной информации. Диалоговые окна, как правило, создаются модальными (modal), блокирующими доступ к остальным окнам приложения, пока пользователь не закончит работу с модальным диалоговым окном. Модальные диалоговые окна располагаются поверх основного окна приложения. Внешний вид диалоговых окон мало отличается от окон с рамкой JFrame, но обычно у них меньше элементов управления окна (чаще всего, имеется только кнопка закрытия окна) и отсутствует системное меню. В Swing диалоговые окна реализуются классом JDialog, унаследованном от базового класса окон JWindow и позволяющим создавать как обычные, так и модальные диалоговые окна. JDialog поддерживает как и JFrame закрытие окна, а в остальном сходен с другими окнами Swing. При создании диалоговых окон Swing необходимо указать «родительское окно», которым может быть окно с рамкой JFrame или другое диалоговое окно JDialog. Имеется также конструктор, не требующий «родительского» окна, но использующий вспомогательное прозрачное окно, о котором было сказано на странице «Окно без рамки JWindow». JDialog пример создания диалоговых окон/** * Тестовый класс создания диалоговых окон */ import javax.swing.*; import java.awt.event.*; public class JDialogTest extends JFrame { private static final long serialVersionUID = 1L; public JDialogTest() { super("DialogWindows"); // Выход из программы при закрытии setDefaultCloseOperation(EXIT_ON_CLOSE); // Кнопки для создания диалоговых окон JButton button1 = new JButton("Немодальное окно"); button1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JDialog dialog = createDialog("Немодальное", false); dialog.setVisible(true); } }); JButton button2 = new JButton("Модальное окно"); button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JDialog dialog = createDialog("Модальное", true); dialog.setVisible(true); } }); // Создание панели содержимого с размещением кнопок JPanel contents = new JPanel(); contents.add(button1); contents.add(button2); setContentPane(contents); // Определение размера и открытие окна setSize(350, 100); setVisible(true); } /** Функция создания диалогового окна. * @param title - заголовок окна * @param modal - флаг модальности */ private JDialog createDialog(String title, boolean modal) { JDialog dialog = new JDialog(this, title, modal); dialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE); dialog.setSize(180, 90); return dialog; } public static void main(String[] args) { new JDialogTest(); } } В примере создаем окно с рамкой JFrame, в панели содержимого которого размещается две кнопки JButton. По нажатию на кнопки создаются диалоговые окна в отдельном методе createDialog(). Диалоговое окно с заданным заголовком JDialog может быть модальным и немодальным. Программа позволяет создать несколько немодальных окон одновременно, но только одно модальное. Немодальные окна не блокируют работу с основным окном приложения. При закрытии диалогового окна используется константа DISPOSE_ON_CLOSE, удаляющую окно после закрытия. Интерфейс работы примера JDialog представлен на следующем скриншоте. Библиотека Swing предоставляет набор стандартных диалоговых окон JDialog для получения и вывода несложной информации. Прежде чем создавать собственное диалоговое окно, следует рассмотреть возможность использования стандартного. Оформление оконНачиная с JDK 1.4 появилась возможность настраивать так называемое визуальное «оформление» окон: рамка, элементы управления окном (кнопки закрытия или свертывания), системное меню. Необходимость этого ощущалась с самых первых выпусков Swing. Сейчас создание различных интерфейсов окон возможна благодаря усовершенствованиям в UI-представителе корневой панели JRootPane. UI-представитель позволяет создавать специальные рамки, заголовок, системное меню и кнопки управления окном, и размещать их в корневой панели нужным образом, используя специализированный менеджер расположения. Менеджер расположения контролирует пространство корневой панели. Кроме этого, при новом оформлении окон отключаются системные элементы окна. В классах JFrame и JDialog имеется статический метод setDefaultLookAndFeelDecorated(), обеспечивающий возможность оформления всех создаваемых окон. Пример оформления окон : JDialog decoration// Оформление окон Swing import javax.swing.*; public class JFrameDecorations { public static void main(String[] args) { // Подключение украшений для окон JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); // Создание окна с рамкой JFrame frame = new JFrame("Oкнo с рамкой"); // Определение способа завершения работы программы frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200, 200); frame.setVisible(true); // Создание диалогового окна JDialog dialog = new JDialog(frame, "Диалоговое окно"); // Определение способа завершения работы диалогового окна dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dialog.setSize(150, 100); // Определение типа оформления диалогового окна dialog.getRootPane().setWindowDecorationStyle(JRootPane.INFORMATION_DIALOG); dialog.setVisible(true); } } В примере создается простое окно с рамкой и диалоговое окно. Перед создания окон вызывается метод setDefaultLookAndFeelDecorated(), означающий, что для создаваемых окон JFrame и JDialog потребуется специальное оформление. Далее определяются размеры окон и они выводятся на экран. Следует обратить внимание на метод корневой панели setWindowDecorationStyle(), позволяющий настроить оформление окна. Если окно с рамкой имеет только один тип оформления, то диалоговые окна в зависимости от их цели (представление информации, сообщение об ошибке и т.д.) могут выглядеть по-разному. В примере было определено, что создаваемое диалоговое окно требуется для вывода информации и должно выглядеть соответствующим образом. Интерфейс примера окон, оформленных с внешним видом Metal, представлен на следующем скриншоте. Специальное оформление окон может быть полезно как средство, позволяющее полностью, вплоть до окон, управлять внешним видом вашего приложения. Создав собственного UI-представителя корневой панели, можно придать своему приложению уникальный вид, легко узнаваемый пользователями. Скачать примерыИсходные коды примеров, рассмотренных в тексте страницы, можно скачать здесь (3.54 Кб). |