18084

Использование системы Swing в Java

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа 7 Использование системы Swing в Java 1. Цель работы Целью работы является приобретение навыков программирования графических приложений Java с использованием элементов управления AWT. 2. Состав рабочего места 2.1. Оборудование: IBMсовместимый п

Русский

2013-07-06

493 KB

52 чел.

Лабораторная работа 7

Использование системы Swing в Java 

1. Цель работы

Целью работы является приобретение навыков программирования графических приложений Java с использованием элементов управления AWT.  

  

2. Состав рабочего места

2.1. Оборудование: IBM-совместимый   персональный компьютер (ПК).

2.2. Программное обеспечение: операционная система Windows, Java 2 SDK версии 6.0 и выше, пакет NetBeans IDE 6.1.

3. Краткие теоретические сведения

3.1. Основные компоненты Swing

3.1.1. Структура компонент Swing

Компоненты Swing можно разделить на следующие типы:

  •  контейнеры верхнего уровня (классы JWindow, JFrame, JDialog и JApplet);
  •  специализированные контейнеры (классы JInternalFrame, JLayeredPane, JRootPane и JOptionPane);
  •  общецелевые контейнеры (классы JPanel, JScrollPane, JSplitPane, JTabbedPane и JToolBar);
  •  компоненты управления (классы JButton, JCheckBox, JRadioButton, JToggleButton, JComboBox, JList, JMenuBar, JMenu, JMenuItem, JCheckboxMenuItem, JRadioButtonMenuItem, JSeparator и JSlider);
  •  нередактируемые информационные компоненты (классы JLabel, JProgressBar и JToolTip);
  •  редактируемые информационные компоненты (классы JColorChooser, JFileChooser, JTable, JTree, JTextField, JPasswordField, JTextArea, JEditorPane и JTextPane).

В отличие от компонентов AWT,  компоненты системы Swing способны работать только по модели делегирования событий.

3.1.2. Контейнеры верхнего уровня и специализированные контейнеры

Так же, как и для AWT, для создания окон графических приложений используется не класс JWindow, а класс JFrame (окна, создаваемые классом JWindow не содержат наименования окна и кнопок управления окном). Приложения с графическим интерфейсом использует, по крайней мере, один фрейм. Апплеты также могут использовать фреймы.

Для создания окон, которые зависят от другого окна (например, исчезают, когда сворачивается окно, в котором они используются) применяются диалоговые окна класса JDialog.  

Апплеты, использующие компоненты Swing, должны быть подклассами класса JApplet.

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

Как правило, отдельное графическое приложение имеет, по крайней мере, одну иерархию контейнеров, в которой корнем является JFrame. Диалоговое окно или апплет также образуют иерархию контейнеров, корнем которой является JDialog или JApplet. Например, если приложение содержит одно главное окно и два диалоговых окна, то она содержит три иерархии контейнеров.  

3.1.2.1. Корневая панель

Каждый контейнер верхнего уровня базируется на промежуточном, скрытом, контейнере, называемом корневой панелью (root pane). Корневая панель определена в классе JRootPane.

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

  •  слоистая панель (layered pane);
  •  панель содержимого (content pane);
  •  строка меню (menu bar) – необязательный компонент;
  •  стеклянная панель (glass bar).

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

3.1.2.2. Панель содержимого

Панель содержимого содержит все компоненты Swing (кнопки, надписи, текстовые поля и т.д.). Поскольку для контейнеров верхнего уровня  содержимое окна определяется с помощью JRootPanel и должно, в отличие от окон AWT, определяться вручную,  для добавления компонент или установки менеджера компоновки используются не методы add() и setLayout(), а методы получения и установки панели содержимого:

public Container getContentPane()

и 

public void setContentPane(Container contentPane),

которые определены в классах JFrame, JDialog, JApplet и JInternalFrame.

Так, добавление текстового поля  во фрейм, диалоговое окно, апплет или внутренний фрейм с установкой менеджера компоновки FlowLayout выглядит следующим образом:

Container contentPane = getContentPane();

JTextField inputField = new JTextField(15);

contentPane.setLayout(new FlowLayout());

contentPane.add(inputField);

Следует отметить, что для всех контейнеров верхнего уровня (включая JApplet) менеджером компоновки по умолчанию является BorderLayout.

К контейнеру верхнего уровня может быть добавлена строка меню (menu bar). Строка меню также располагается внутри главного контейнера, но за пределами  панели содержимого.

3.1.2.4. Класс JFrame

Фрейм в Swing создается с помощью конструкторов

JFrame()

или 

JFrame (String name)

где name – имя фрейма.

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

Другим отличием JFrame от Frame является наличие у JFrame свойства, определяющего операцию закрытия окна по умолчанию. Для Frame по умолчанию ничего не происходит, если делается попытка закрыть окно, а JFrame прячется. Метод

public void setDefaultCloseOperation(int operation)

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

  •  DO_NOTHING_ON_CLOSE  – ведет себя так же, как AWT Frame;
  •  HIDE_ON_CLOSE  – поведение по умолчанию (для того, чтобы окно снова появилось на экране, необходимо использовать метод setVisible(true);
  •  DISPOSE_ON_CLOSE  – окно закрывается.

3.1.2.5. Диалоговые окна

Диалоговые окна можно создавать либо с помощью класса JDialog, либо используя класс JOptionPane.

Основными конструкторами класса JDialog являются:

JDialog();

JDialog(Dialog owner)

JDialog(Dialog owner, boolean modal)

JDialog(Dialog owner, String title)

JDialog(Dialog owner, String title, boolean modal)

JDialog(Frame owner)

JDialog(Frame owner, boolean modal)

JDialog(Frame owner, String title)

JDialog(Frame owner, String title, boolean modal)

Первый конструктор создает немодальное диалоговое окно без имени. Параметры owner, title и modal в остальных конструкторах задают соответственно родителя данного диалогового окна, имя окна и окна (true – модальное окно или false – немодальное  окно).

Окно класса JDialog имеет те же черты, что JFrame и прямое использование объектов класса JDialog аналогично прямому использованию объекта JFrame.

Класс JOptionPane облегчает вывод стандартных диалоговых или информационных окон.

Для класса JOptionPane определены следующие основные конструкторы:

JOptionPane();

JOptionPane(Object message, int messageType,

int optionType, Icon icon, Object[] options,

Object initialValue);

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

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

  •  static int showConfirmDialog(Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon) задает вопрос на который требуется ответ типа Yes, No или Cancel. Существуют также следующие три метода showConfirmDialog(): метод, содержащий первые два параметра, метод, содержащий первые четыре параметра и метод, содержащий первые пять параметров, приведенного выше метода;
  •  static Object showInputDialog(Component parentComponent, Object message, String title, int messageType, Icon icon, Object[] selectionValues, Object initialValue) позволяет ввести некоторый текст. Существуют также следующие пять методов showInputDialog(): метод, содержащий второй параметр, метод, содержащий второй и седьмой параметры, метод, содержащий первые два параметра, метод, содержащий первый, второй и седьмой параметры,  и метод, содержащий первые три параметра и седьмой параметр;
  •  static void showMessageDialog(Component parentComponent, Object message, String title, int messageType, Icon icon)позволяет вывести некоторое сообщение. Существуют также следующие два метода showMessageDialog: метод, содержащий первые два параметра и метод, содержащий первые четыре параметра;
  •  static int showOptionDialog(Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon, Object[] options, Object initialValue)объединяет функции перечисленных выше диалоговых окон.

Параметры в приведенных конструкторах и методах имеют следующий смысл:

  •  parentComponent – определяет компонент, являющийся родителем данного диалогового окна (если этот параметр равен null, в качестве родителя предполагается фрейм по умолчанию);
  •  message – описательное сообщение, помещаемое в диалоговое окно (следует иметь в виду, что это объект класса Object);
  •  selectionValues – массив объектов, рассматриваемый как набор сообщений;
  •  icon – изображение, выводимое в диалоге (значение по умолчанию определяется значением параметра messageType);
  •  messageTypeопределяет тип сообщения. Допустимы следующие значения: ERROR_MESSAGE, INFORMATION_MESSAGE, WARNING_MESSAGE, QUESTION_MESSAGE и PLAIN_MESSAGE;
  •  optionTypeопределяет набор кнопок, которые будут выведены в нижней части диалогового окна:  DEFAULT_OPTION, YES_NO_OPTION, YES_NO_CANCEL_OPTION и OK_CANCEL_OPTION 
  •  options – более детальное описание набора кнопок, которые будут выведены в нижней части диалогового окна (если задан объект класса Component, он прямо добавляется в нижнюю часть диалогового окна, если объект типа Icon, создается кнопка класса JButton, для объектов других классов производится преобразование объекта в строку, которая выводится на кнопке класса JButton);
  •  title – имя диалогового окна;
  •  initialValue – вводимое значение по умолчанию.

Для методов и допустимы следующие возможные значения возвращаемого значения: YES_OPTION, NO_OPTION, CANCEL_OPTION, OK_OPTION и CLOSED_OPTION.

3.1.3. Общецелевые контейнеры

3.1.3.1. Класс JPanel 

Класс JPanel является вариантом класса Panel в AWT. Четыре конструктора класса:

public JPanel()

public JPanel(LayoutManager layout)

public JPanel(boolean isDoubleBuffered)

public JPanel(LayoutManager layout,

boolean isDoubleBuffered)

обеспечивают создание объекта JPanel соответственно под управлением менеджера компоновки FlowLayout, под управлением заданного менеджера компоновки, с встроенной поддержкой двойной буферизации и, наконец, под управлением заданного менеджера компоновки и с встроенной поддержкой двойной буферизации.

Работа с объектами класса JPanel не отличается от работы с объектами класса Panel, за исключением того, что панель добавляются не во фрейм, а в панель содержимого фрейма.   

3.1.3.2. Класс JTabbedPane

Панель с вкладками (tabbed pane) введена в Swing вместо использовавшегося в AWT менеджера CardLayout, т.е. менеджер компоновки CardLayout в Swing не реализован. Каждая вкладка имеет заголовок. Когда пользователь выбирает вкладку, ее содержимое становится видимым. Только одна из вкладок может быть выбрана одновременно. Панель с вкладками обычно используется для установки параметров конфигурации.

Панель с вкладками реализована классом JTabbedPane, который имеет следующие конструкторы

JTabbedPane()

JTabbedPane(int tabPlacement)

JTabbedPane(int tabPlacement, int tabLayoutPolicy)

Первый конструктор создает новую панель с вкладками, в которой заголовки вкладок расположены сверху, а второй позволяет определить расположение заголовков вкладок (JTabbedPane.TOPсверху, JTabbedPane.BOTTOMснизу, JTabbedPane.RIGHTвправо  или JTabbedPane.LEFTвлево). Третий конструктор дополнительно задает правило расположения вкладок (JTabbedPane.WRAP_TAB_LAYOUT – вкладки располагаются в несколько рядов, если они не помещаются в одном ряду – значение по умолчанию  и JTabbedPane.SCROLL_TAB_LAYOUT – вкладки прокручиваются, если они не помещаются в одном ряду).

Формирование в программе панели с вкладками выполняется с помощью следующей процедуры:

  1.  Создать объект JTabbedPane.
  2.  Для добавления каждой вкладки в панель вызвать один из методов  addTab():

public void addTab(String title, Icon icon,

Component component, String tip)

public void addTab(String title, Icon icon,

Component component)

public void addTab(String title, Component component)

Аргументы этих методов определяют заголовок вкладки title, компоненту component, который она содержит, изображение icon и всплывающую подсказку tip.

  1.  Добавить панель с вкладками в панель содержания окна.

Для отслеживания выбора той или иной вкладки используется блок прослушивания ChangeListener, который добавляется или удаляется с помощью методов

public void addChangeListener(ChangeListener l)

и 

public void removeChangeListener(ChangeListener l)

класса JTabbedPane. В интерфейсе ChangeListener определен единственный метод

 public void stateChanged(ChangeEvent e),

в котором с помощью методов 

public Component getSelectedComponent()

или

public int getSelectedIndex()

класса JTabbedPane можно получить выбранный компонент или индекс выбранного компонента.

3.1.3.3. Класс JSplitPane

Расщепленные панели (класс  JSplitPane) используются для разделения выводимой панели на две компоненты. Конструкторы класса

public JSplitPane()

public JSplitPane(int newOrientation)

public JSplitPane(int newOrientation,

boolean newContinuousLayout)

public JSplitPane(int newOrientation,

Component newLeftComponent, Component newRightComponent)

public JSplitPane(int newOrientation,

boolean newContinuousLayout, Component newLeftComponent,

Component newRightComponent)

задают в параметре newOrientation выравнивание слева направо с использованием константы  JSplitPane.HORIZONTAL_SPLIT или сверху вниз с использованием константы JSplitPane.VERTICAL_SPLIT, в параметре newContinuousLayout непрерывную перерисовку компонент при перемещении разделителя (значение true) или перерисовку компонент после окончания перемещения разделителя (значение false), а в параметрах newLeftComponent и newRightComponent – компоненты расщепленной панели.

Положение разделителя в панели задается с помощью метода

public void setDividerLocation(int location),

который задает в пикселях позицию x  или y разделителя (в зависимости от вертикальной или горизонтальной ориентации панелей). Метод

public void setOneTouchExpandable(boolean newValue)

позволяет задать на разделительной полосе кнопки (со стрелками) для быстрого сворачивания и разворачивания одной из панелей расщепленной панели.

3.1.4. Значки, надписи и кнопки

3.1.4.1. Интерфейс Icon и класс ImageIcon

Значки (icons) реализуются в Swing с помощью интерфейса Icon (на самом деле они не являются компонентами и их можно использовать практически со всеми компонентами Swing). Реализацией интерфейса Icon, создающей значок из изображения, является класс  ImageIcon. Двумя основными конструкторами этого класса являются:  

ImageIcon(String filename)

ImageIcon(URL url)

Первая форма использует изображение в файле с именем filename (используется в графических приложениях)  а вторая форма – в ресурсе, расположенном по URL-адресу url (используется в апплетах Swing)

В отличие от класса Image, в классе ImageIcon изображение загружается предварительно с использованием методов класса MediaTracker.

Для создания собственных изображений можно непосредственно реализовывать интерфейс Icon.

3.1.4.2. Класс JLabel

Надписи Swing являются объектами  класса JLabel. Этот объект может отображать тексты и/или значки. Основными его конструкторами являются:

JLabel(Icon image)

JLabel(String text)

JLabel (String text, Icon image, int horizontalAlignment)

В этих конструкторах text и image – текст и значок, используемый в надписи. Параметр horizontalAlignment определяет выравнивание и имеет значения LEFT, RIGHT или CENTER. Эти константы определены в интерфейсе SwingConstants, наряду с несколькими другими, используемыми классами системы Swing.

Значок и текст, связанный с надписью, можно считывать и записывать следующими методами:

public Icon getIcon();

public String getText();

public void setIcon(Icon image);

public void setText(String text);

Для обработки событий в объектах класса JLabel можно использовать интерфейс MouseListener и класс MouseEvent.

3.1.4.3. Класс AbstractButton

Кнопки Swing являются подклассами  класса AbstractButton. Этот класс содержит много методов, которые позволяют управлять поведением кнопок, флажков и переключателей. Например, можно определять различные значки для отображения компонента, когда он отжат (disabled), нажат (pressed), или выбран (selected). Некоторый значок можно использовать как значок "наезда" (rollover), который отображается, когда курсор мыши установлен поверх этого компонента ("наехал" на него). Ниже приведены  описания методов, которые управляют этим поведением:

public void setDisabledIcon(Icon image)

public void setPressedIcon (Icon image)

public void setSelectedIcon(Icon image)

public void setRolloverIcon(Icon image)

Текст, связанный с кнопкой, можно читать и записывать с помощью следующих методов:

public String getText()

public void setText(String text)

В классе AbstractButton определены также методы

public int getMnemonic()

и 

public void setMnemonic(int mnemonic)

соответственно для получения и установки «горячих» клавиш. В качестве параметра при установке «горячей» клавиши задается оно из статических свойств класса KeyEvent. Эти свойства имеют общее имя VK_XXX, где XXX – имя одной из клавиш, например, VK_D.

При нажатии кнопки конкретные подклассы AbstractButton генерируют события Action. Блоки прослушивания регистрируют и отменяют регистрацию для этих событий с помощью следующих методов:

void addActionListener(ActionListener l)

void removeActionListener(ActionListener l)

3.1.4.4. Класс JButton

Класс JButton является подклассом класса AbstractButton и обеспечивает функциональные возможности кнопки. Этот класс позволяет связать с кнопкой изображение, текст или и то и другое. Некоторые из его конструкторов:

JButton(Icon image)

JButton(String text)

JButton(String text, Icon image)

Здесь text и image – надпись и изображение, используемые для кнопки.

Класс JButton наследует свойства интерфейса SwingConstants, а также свойства и методы класса AbstractButton.

Для обработки событий в объектах класса JButton можно использовать интерфейс ActionListener и класс ActionEvent.

3.1.5. Флажки и переключатели

Класс JCheckBox, который обеспечивает функциональные возможности флажка, является конкретной реализацией класса AbstractButton. некоторые из его конструкторов:

JCheckBox(Icon image)

JCheckBox(Icon image, boolean state)

JCheckBox(String text)

JCheckBox(String text, boolean state)

JCheckBox (String text, Icon image)

JCheckBox(String text, Icon image, boolean state)

В этих конструкторах используются следующие параметры: image — изображение для флажка, text – надпись. Если state имеет значение true, то флажок первоначально выбран.

Состояние флажка может быть изменено с помощью метода

void public void setSelected(boolean b),

а получить состояние флажка можно с помощью метода

public boolean isSelected().  

Переключатели поддерживаются классом JRadioButton,  который также является конкретной реализацией класса AbstractButton. Ниже приведены некоторые из его конструкторов:

JRadioButton(Icon image)

JRadioButton(Icon image, boolean state)

JRadioButton(String text)

JRadioButton(String text, boolean state)

JRadioButton(String text, Icon image)

JRadioButton(String text, Icon image, boolean state)

где параметры имеют тот же смысл, что и для класса JCheckBox.

Переключатели должны быть объединены в группу, где в каждый момент может быть выбран только один элемент. Например, если пользователь щелкает по переключателю, который находится в группе, любой предварительно нажатый переключатель в этой группе автоматически сбрасывается. Чтобы создать группу кнопок, создается объект класса ButtonGroup. Для этой цели используется единственный конструктор класса

public ButtonGroup().

Элементы к группе переключателей добавляются с помощью метода

public void add(AbstractButton a),

а количество переключателей в группе можно получить с помощью метода

public int getButtonCount().

Родительским классом и для JCheckBox и для JRadioButton является класс JToggleButton, который не имеет эквивалента в AWT. Он ведет себя как объект класса Button, который после нажатия на него остается в нажатом состоянии.

Для обработки событий в объектах классов JCheckBox и JRadioButton можно использовать интерфейс ItemListener и класс ItemEvent.

3.1.6. Списки

3.1.6.1. Класс JComboBox

Вместо класса Choice в AWT, в системе Swing обеспечивает комбинированное поле (combo box) – комбинация текстового поля и раскрывающегося списка (класс JComboBox). Комбинированное поле обычно отображает один вход (элемент) списка. Однако оно может также отображать и раскрывающийся список, который дает возможность пользователю выбирать различные элементы. Вы также можете ввести с клавиатуры свое значение элемента списка в текстовое поле. Два самых распространенных конструктора:

JComboBox()

JComboBox(Object [] items)

позволяют создать пустой список с выбором или задать массив объектов данного списка.

Элементы добавляются к списку выбора с помощью метода

void addItem(Object obj)

где obj – объект, который будет добавлен к комбинированному полю.

Остальные методы класс аналогичны соответствующим методам класса Choice, однако добавлены методы

public void setEditable(boolean aFlag)

и

public boolean isEditable(),

позволяющие установить возможность ввода значения в список и проверить флажок возможности ввода своего значения в список.

Для обработки событий, связанных с комбинированным списком, можно использовать либо блоки прослушивания ItemListener, либо блоки прослушивания ActionListener.

3.1.6.2. Класс JList

Аналогом класса List в Swing является класс JList. Два самых распространенных конструктора этого класса

JList()

JList(Object [] items)

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

не выполняется в JList автоматически, а выполняется с помощью помещения списка в объект класса JScrollPane.

Набор методов в классе JList существенно расширен по сравнению с классом List (так, например, есть возможность задавать цвет текста и фона  для выделенных элементов) и, кроме того, вместо интерфейса ItemListener для списков JList используется интерфейс ListSelectionListener, блок прослушивания которого добавляется и удаляется с помощью методов

public void addListSelectionListener(ListSelectionListener

listener)

и 

public void removeListSelectionListener(

ListSelectionListener listener)

класса JList.

Метод 

public void valueChanged(ListSelectionEvent e)

интерфейса обрабатывает события, связанные с выбором элементов списка, а метод

public Object[] getSelectedValues()

класса JList позволяет получить список выбранных объектов.

3.1.6.3. Класс JSpinner

Класс JSpinner определяет «вращающийся» список. Этот класс похож на класс JComboBox, но однострочный список можно прокручивать в двух направлениях: вверх и вниз с помощью двух кнопок справа от поля выбора.

Для класса JSpinner определены два конструктора:

JSpinner()

и

 JSpinner(SpinnerModel model).

Второй конструктор создает объект для заданной модели «вращающего» списка. В пакете определены класса для наиболее употребительных моделей  «вращающего» списка: SpinnerListModel (для списков), SpinnerNumberModel (для чисел) и SpinnerDateModel (для дат).

Установить или получить модель можно либо с помощью методов

void setModel(SpinnerModel model)

и

SpinnerModel getModel().

Изменить выводимое в поле значение можно с помощью метода

void setValue(Object value),

а получить текущее значение поля можно с помощью метода

Object getValue()  

класса JSpinner.

Установить конкретную модель для списков можно с помощью следующих конструкторов:

SpinnerListModel();

SpinnerListModel(List values);

SpinnerListModel(Object[] values);

Первый конструктор создает модель для пустого списка, второй для списка объектов коллекции List, а третий для массива объектов класса Object.

Метод

void setValue(Object obj)

изменяет элемент в поле вывода и уведомляет блок прослушивания ChangeListener. Методы

Object getValue().

Object getNextValue()

Object getPreviousValue()

позволяют получить соответственно текущее значение поля вывода, следующее значение поля вывода и предыдущее значение поля вывода. Если текущий элемент – последний, метод getNextValue() возвращает null, а если текущий элемент – первый, метод getPreviousValue() возвращает null.  

Основными конструкторами модели чисел являются:

SpinnerNumberModel();

SpinnerNumberModel(int value, int minimum,

int maximum, int stepSize)

где value – выводимое в поле вывода значение, minimum – минимальное значение списка, maximum – максимальное значение списка,  stepSize – шаг списка. Пустой конструктор устанавливает список с нулевым значением в поле вывода, без ограничений на максимальное и минимальное значение и с шагом, равным 1.

Значения указанных параметров также можно установить с помощью методов

void setValue(Object value)

void setMinimum(Comparable minimum)

void setMaximum(Comparable maximum)

void setStepSize(Number stepSize)

а получить их значения – с помощью методов

Object getValue()

Object getNextValue()

Object getPreviousValue()

Comparable getMinimum()

Comparable getMaximum()

Number getStepSize()

Для работы с датами определены следующие конструкторы:

SpinnerDateModel();

SpinnerDateModel(Date value, Comparable start,

Comparable end, int calendarField)

где value – выводимое значение даты, start и end – начальное и конечное значение даты, а допустимые значения для calendarField:

  •  Calendar.ERA – эра (значение GregorianCalendar.BC – до нашей эры или GregorianCalendar.AD – наша эра);
  •  Calendar.YEAR и Calendar.MONTH – значение года и месяца (от 0 до 11);  
  •  Calendar.WEEK_OF_YEAR и Calendar.WEEK_OF_MONTHнеделя года и неделя месяца;
  •  Calendar.DAY_OF_MONTH и Calendar.DAY_OF_YEARдень месяца и день года;
  •  Calendar.DAY_OF_WEEK и  Calendar.DAY_OF_WEEK_IN_MONTH – день недели (от 1 до 7) и день недели в месяце (1-7 дни месяца – 1 неделя, 8-14 – 2 неделя и т.д.);
  •  Calendar.AM_PM – до полудня – значение Calendar.AM или после полудня – значение Calendar.PM;
  •  Calendar.HOUR и Calendar.HOUR_OF_DAY, - час в формате от 0 до 12 или от 0 до 24;
  •  Calendar.MINUTE, Calendar.SECOND и Calendar.MILLISECONDминута, секунда и миллисекунда.

Значения указанных параметров также можно установить с помощью методов

void setValue(Object value)

void setStart(Comparable start)

void setEnd(Comparable end)

void setCalendarField(int calendarField)

а получить их значения – с помощью методов

Object getValue()

Object getNextValue()

Object getPreviousValue()

Comparable getStart()

Comparable getEnd()

Number getCalendarField ()

Метод 

Date getDate()

возвращает текущий элемент в последовательности дат в виде объекта класса Date.

Для обработки событий в объектах класса JSpinner можно использовать интерфейс ChangeListener и класс ChangeEvent.

3.1.7. Текстовые компоненты

3.1.7.1. Класс JTextComponent

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

Возможности компонента JTextComponent библиотеки Swing намного превосходят требования, предъявляемые к обычному текстовому полю или надписи. Данный компонент предоставляет разработчикам большой набор методов работы с текстом, например:

  •  public void copy() – копировать в буфер обмена;
  •  public void cut() – вырезать в буфер обмена;
  •  public void paste() вставить из буфера обмена;
  •  public String getSelectedText() – получить выделенный текст;
  •  public int getSelectionStart() – определить точку начала выделенного текста;
  •  public int getSelectionEnd() – определить точку конца выделенного текста;
  •  public String getText()ввести текст из поля;
  •  public void setText(String text)поместить текст в поле;
  •  public void setEditable(boolean b)разрешить редактирование;
  •  public void setCaretPosition(int position)поместить курсор в указанную позицию.

3.1.7.2. Классы JTextField, JPasswordField и JTextArea

Подклассы класса JTextComponent  – JTextField и JTextArea практически аналогичны классам TextField и TextArea пакета AWT. Между ними существуют лишь следующие отличия:

  •  строки ввода паролей задаются в Swing с помощью отдельного класса JPasswordField  (конструкторы этого класса аналогичны конструкторам класса JTextField, метод public char[] getPassword() позволяет получить значение введенного пароля, а методы public void setEchoChar(char c) и public char getEchoChar() – установить и получить значение эхо-символа);
  •  прокрутка объекта класса JTextArea (так же, как и объекта класса  JList) выполняется с помощью помещения списка в объект класса JScrollPane.

Для обработки событий в объектах класса JButton можно использовать интерфейс ActionListener и класс ActionEvent. Однако обычно с текстовыми компонентами связана кнопка, для которой и выполняется обработка события.

3.1.8. Меню  

Компоненты JMenuBar, JMenu, JMenuItem и JCheckBoxMenuItem в Swing по своим функциональным возможностям и использованию аналогичны компонентам MenuBar, Menu, MenuItem и CheckboxMenuItem, используемым в AWT.  

Новый компонент JRadioButtonMenuItem позволяет организовать  в меню переключатели. Группа альтернативных переключателей формируется следующим образом: сначала создается объект класса ButtonGroup, а затем в этот объект с помощью метода add() добавляются объекты класса JRadioButtonMenuItem.

Классы, реализующие меню в Swing, отличаются от соответствующих классов AWT следующими основными особенностями:

  •  поскольку все классы, кроме JMenuBar, являются подклассами класса JAbsractButton, для меню и пунктов меню можно задавать не только текст, но и изображения (для этого в конструкторы этих классов введен параметр Icon image и добавлены методы, связанные с изображениями);
  •  строка меню устанавливается с помощью метода  public void setJMenuBar(JMenuBar menubar) класса JFrame;
  •  добавлен интерфейс MenuListener для обработки событий связанных с меню (объектами класса JMenu). Методы этого интерфейса

public void menuSelected(MenuEvent e)

public void menuDeselected(MenuEvent e)

public void menuCanceled(MenuEvent e)

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

public void addMenuListener(MenuListener l)

и 

public void removeMenuListener(MenuListener l);

мнемонические клавиши («горячие» клавиши) для меню и пунктов меню в отличие от AWT действуют только тогда, когда соответствующие меню или пункты меню выведены на экране. Для того, чтобы клавиши действовали независимо от того, виден ли соответствующий элемент меню на экране, необходимо задать такие клавиши с помощью метода public void setAccelerator(KeyStroke keyStroke); 

  •  для пунктов меню введен интерфейс MenuDragMouseListener, методы которого

public void menuDragMouseEntered(MenuDragMouseEvent e)

public void menuDragMouseExited(MenuDragMouseEvent e)

public void menuDragMouseDragged(MenuDragMouseEvent e)

public void menuDragMouseReleased(MenuDragMouseEvent e)

позволяют организовать обработку событий, связанных с перемещением курсора мыши над пунктами меню (например, изменения вида пункта меню при наведении на него курсора мыши). Блоки прослушивания для меню добавляются и удаляются с помощью методов

public void addMenuDragMouseListener(

MenuDragMouseListener l)

и 

public void removeMenuDragMouseListener(

MenuDragMouseListener l);

  •  кроме этого, для пунктов меню введен интерфейс MenuKeyListener, методы которого

public void menuKeyTyped(MenuKeyEvent e)

public void menuKeyPressed(MenuKeyEvent e)

public void menuKeyReleased(MenuKeyEvent e)

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

3.1.9. Бегунки и подсказки

3.1.9.1. Классы JScrollBar и JSlider

Полоса прокрутки (класс JScrollBar) в Swing практически не отличается от полосы прокрутки (класс Scrollbar) в AWT.

Бегунки реализуются в Swing с помощью класса JSlider. Этот компонент, как и JScrollBar, позволяет выбрать значение с помощью перемещения бегунка. Основными конструкторами класса  JSlider являются 

JSlider()

JSlider(int orientation)

JSlider(int min, int max)

JSlider(int min, int max, int value)

JSlider(int orientation, int min, int max, int value)

где параметр orientation задает ориентацию, а параметры min, max и value соответственно минимальное, максимальное и текущее значение бегунка.

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

public void setMajorTickSpacing(int n)

и 

public void setMinorTickSpacing(int n),

где параметр n задает расстояние между рисками в пикселях.

Для отслеживания событий бегунка используется интерфейс ChangeListener и класс ChangeEvent.

3.1.9.2. Класс JToolTip

«Всплывающие» подсказки (текст, появляющийся, если навести на некоторое время указатель мыши на какой-либо объект) реализуются в Swing с помощью класса JToolTip. Объект этого класса создается с помощью конструктора

JToolTip().

Прикрепить подсказки к компоненту и получить компонент, к которому прикреплена данная подсказка, можно с помощью методов

void setComponent(JComponent comp)

и

JComponent getComponent(),

а установка и получение текста подсказки выполняется с помощью методов

void setTipText(String tipText)

и

String getTipText().

Методы класса JComponent

public void setToolTipText(String text)

и

public String getToolTipText()

позволяют установить и получить подсказку непосредственно для любого графического компонента.  

3.1.10. Оформление рамок

Каждый стандартный графический компонент в Java содержится в прямоугольной области на экране со сторонами, параллельными сторонам экрана. Для некоторых графических компонент стороны этого прямоугольника выделяются каким-то образом. Так, например, стороны кнопки класса JButton нарисованы так, что создают впечатление ее выпуклости. При нажатии кнопки мыши на ней графическое оформление сторон кнопки JButton меняется, создавая впечатление ее «вдавленности».

Библиотека Swing позволяет изменить оформление границ любого компонента, в том числе и контейнера с помощью рамок разного вида.

Самые общие характеристики всех рамок описаны интерфейсом Border из пакета javax.swing.border. Вычерчивание рамки выполняется методом

public void paintBorder(Component c, Graphics g,

int x, int y, int width, int height);

Здесь задается компонент c, который обводится рамкой, экземпляр g класса Graphics, обладающего методами рисования, и размеры рамки, которые обычно совпадают с размерами компонента, либо чуть больше или чуть меньше их.

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

public boolean isBorderOpaque().

Третий и последний метод интерфейса 

public Insets getBorderInsets(Component c)

возвращает пространство, занятое рамкой данного компонента c, в виде экземпляра класса Insets. В классе Insets это пространство определяется толщиной рамки сверху top, слева left, справа right и снизу bottom. Все четыре поля класса Insets являются целочисленными переменными.  

который можно использовать для определения размеров самого компонента без рамки.

Класс AbstractBorder расширяют около двадцати классов, вычерчивающих самые разнообразные рамки. Для удобства работы с ними в пакете javax.swing есть класс BorderFactory, в котором собраны статические методы вида createXxxBorder() для разных типов рамок с разными параметрами. Чаще всего для создания рамки достаточно воспользоваться одним из этих методов, а затем установить полученную рамку в компонент методом

public void setBorder(Border border)

класса JComponent, например:

JLabel myLabel = new JLabel(

"Надпись с толстой синей рамкой");

myLabel.setBorder(BorderFactory.createLineBorder(

Color.blue, 3));

Ниже приведены основные статические методы класса BorderFactory для создания рамок различных типов:

  •  метод public static Border createEmptyBorder() создает пустую рамку с нулевыми размерами, а статический метод public static Border createEmptyBorder (int top, int left, int bottom, int right) – пустую рамку с заданными размерами;
  •  методы public static Border createLineBorder(Color color) и public static Border createLineBorder(Color color, int thickness) создают соответственно рамку с заданным цветом и рамку с заданным цветом заданной толщины;
  •  метод public static Border createBevelBorder(int type) создает рамку заданного типа type (выпуклого – BevelBorder.RAISED или вогнутого – BevelBorder.LOWERED), метод public static Border createBevelBorder(int type, Color highlight, Color shadow) создает рамку заданного типа с заданным светлым (highlight) и темным (shadow) цветом, а метод public static Border createBevelBorder(int type, Color highlightOuter, Color highlightInner, Color shadowOuter, Color shadowInner) создает объемную двухцветную рамку заданного типа (внутренние линии имеют цвета highlightInner и shadowInner, а внешние – цвета highlightOuter и shadowOuter);
  •  метод public static Border createEtchedBorder() создает стандартную «врезанную» рамку с цветами чуть светлее и чуть темнее цвета фона, метод public static Border createEtchedBorder(int type) создает «врезанную» рамку (если type равен EtchedBorder.RAISED) или «вдавленную» (если type равен EtchedBorder.LOWERED), метод public static Border createEtchedBorder(Color highlight, Color shadow) задает цвета «врезанной рамки», а метод public static Border createEtchedBorder(int type, Color highlight, Color shadow) объединяет возможности двух предыдущих методов;
  •  рамка одного цвета, но из линий разной толщины задается с помощью метода public static MatteBorder createMatteBorder(int top, int left, int bottom, int right, Color color), где colorцвет рамки,  top, left, bottom и rightтолщина рамки (в пикселях)  соответственно сверху, слева, снизу и справа, а метод public static MatteBorder createMatteBorder(int top, int left, int bottom, int right, Icon tileIcon) задает в качестве рамки повторяющееся изображение tileIcon;
  •  метод public static TitledBorder createTitledBorder(Border border, String title, int titleJustification, int titlePosition, Font titleFont, Color titleColor) задает для рамки border надпись title шрифтом titleFont и цвета titleColor, выровненную по горизонтали в соответствии со значением titleJustification (одна из статических констант класса TitledBorder: LEFT, CENTER, RIGHT, LEADING, TRAILING или DEFAULT_JUSTIFICATIONзначение  LEADING) и по вертикали соответствии со значением titlePosition (одна из статических констант класса TitledBorder: ABOVE_TOP, TOP, BELOW_TOP, ABOVE_BOTTOM, BOTTOM, BELOW_BOTTOM или DEFAULT_POSITIONзначение TOP). Остальные пять методов createTitledBorder() содержат отдельные параметры или часть параметров приведенного выше метода;
  •  метод public static CompoundBorder createCompoundBorder(Border outsideBorder, Border insideBorder) используется для создания рамки, состоящей из двух вложенных рамок любых типов.

Хотя библиотека Swing предоставляет множество готовых рамок и  класс BorderFactory для их быстрого создания, часто возникает необходимость сконструировать оригинальную рамку.

Для ее создания можно расширить абстрактный класс AbstractBorder, определив хотя бы один конструктор, и переопределив методы paintBorder() и getBorderInsets(). Если рамка непрозрачна, то надо переопределить метод isBorderOpaque() так, чтобы он возвращал true.

Свою рамку можно создать, расширив какой-либо класс рамок, например, для рамки, расширяющей класс TitledBorder, в заголовок можно вставить не надпись, а компонент класса JComponent.

3.2. Основные менеджеры компоновки Java

3.2.1. Принципы функционирования менеджеров компоновки

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

Интерфейс LayoutManager является интерфейсом в библиотеке классов Java, описывающим как класс Container и менеджер компоновки взаимодействуют между собой. Он объявляет несколько методов, которые:

располагают контейнер в заданной панели – метод public void layoutContainer (Container parent);

информируют менеджер компоновки о добавлении и удалении компонентов из контейнера – методы public void addLayoutComponent(String name, Component comp) и public void removeLayoutComponent(Component comp);

задают размеры компонентов, которыми они управляютметоды public Dimension minimumLayoutSize(Container parent) и public Dimension preferredLayoutSize (Container parent).

Дополнительный интерфейс с методами позиционирования и проверки, LayoutManager2,  был добавлен в JDK 1.1. В этом интерфейсе объявлен метод 

public Dimension maximumLayoutSize(Container parent)

и методы, возвращающие выравнивание по осям x и y:

public float getLayoutAlignmentX(Container target)

public float getLayoutAlignmentY(Container target).

Кроме того, добавлен метод 

public void addLayoutComponent(Component comp,

Object constraints),

добавляющий заданный компонент с использованием заданного объекта-ограничителя и метод

public void invalidateLayout (Container target),

делающий контейнер недействительным.

В AWT определены пять различных типов менеджеров компоновки:

  •  FlowLayout – последовательное  расположение;
  •  GridLayout – табличное расположение;
  •  BorderLayout – полярное расположение;
  •  CardLayout – блокнотное расположение;
  •  GridBagLayout – ячеистое расположение.

Все эти менеджеры реализуют интерфейс LayoutManager, а менеджеры BorderLayout, CardLayout и GridBagLayout – также интерфейс LayoutManager2. Установка менеджера компоновки для контейнера выполняется с помощью метода

public void setLayout(LayoutManager manager),

где параметр manager определяет объект одного из классов менеджеров компоновки, например:

setLayout(new GridLayout(3,2));  

Метод 

public LayoutManager  getLayout()

возвращает менеджер компоновки для данного контейнера.

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

public int top,

public int left,

public int bottom,

public int right,

задающие отступ сверху, справа, снизу и слева (в пикселях). Менеджер компоновки создает объект класса Insets, обратившись к конструктору класса

public Insets(int top, int left, int bottom, int right),

который возвращает объект Insets. Параметры  top, left, bottom и right определяют промежутки (в пикселях) соответственно от верхней, левой, нижней и правой границ контейнера. Например, если требуется оставить пространство шириной 20 пикселей снизу и сверху и 10 пикселей по бокам, нужно   определить в программе следующий метод insets():

public Insets insets()

{

return new Insets (20, 10, 20, 10);

}

Для выполнения своей работы менеджер компоновки должен связываться с объектом класса Container. Если контейнер не имеет связанного с ним менеджера компоновки, он просто помещает компоненты с использованием методов класса Component 

public void setBounds(Rectangle r),

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

public void setLocation(Point p),

перемещающим компонент или 

public void setSize(Dimension d),

изменяющим размеры компонента.     

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

Как уже указывалось выше, LayoutManager связан с объектом класса Container вызовом метода setLayout(), например:

Panel p = new Panel();

p.setLayout(new BorderLayout());

Некоторые контейнеры, такие как Panel, обеспечивает конструктор, который в качестве аргумента воспринимает менеджер компоновки:

Panel p = new Panel(new BorderLayout());

При создании собственных менеджеров компоновки также должен быть реализован  интерфейс LayoutManager и, возможно,  LayoutManager2.

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

В тех случаях, когда требуется вручную расположить компоненты, используется абсолютное позиционирование компонент. Поскольку даже когда менеджер компоновки не задан, действует менеджер по умолчанию (FlowLayout для Panel и BorderLayout для Frame), необходимо отключить менеджеры компоновки, действующие по умолчанию, с помощью оператора

setLayout(null);

3.2.2. Менеджер FlowLayout

Класс FlowLayout рассматривает как контейнер набор строк. Этот менеджер используется по умолчанию в объектах классов Panel и  Applet.

Это самый простой из менеджеров компоновки AWT. Его стратегия компоновки являются следующей:

учитывать предпочитаемый размер всех содержащихся компонент.

скомпоновать как можно больше компонент горизонтально внутри контейнера.

начать новую строку компонент, если они еще есть.

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

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

Конструктор

public FlowLayout(int alignment, int hgap, int vgap)

создает объект FlowLayout. Параметр  alignment регулирует выравнивание строк, а возможные типы выравнивания задаются следующими переменными класса FlowLayout с модификаторами public static final int: LEFT (влево), RIGHT (вправо) и CENTER (по центру). Параметры  hgap и vgap задают  размеры промежутков между компонентами по вертикали и горизонтали (в пикселях). Так, чтобы расположить компоненты с правым выравниванием с промежутком 10 пикселей по вертикали и 5 пикселей по горизонтали, надо создать объект FlowLayout следующим образом:

myFlowLayout = new FlowLayout(FlowLayout.RIGHT, 10, 5);

 Можно также использовать конструкторы

public FlowLayout(int alignment)

и

public FlowLayout()

(по умолчанию hgap и vgap равны 5 пикселей и выравнивание производится по центру).

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

Класс FlowLayout, помимо методов интерфейса  LayoutManager, обеспечивает также следующие методы:

public int getAlignment() и public void setAlignment(int align) – получение и установка выравнивания;

public int getVgap() и public void setVgap(int vgap) – получение и установка промежутка по вертикали между компонентами;

public int getHgap() и public void setHgap(int hgap) – получение и установка промежутка по горизонтали между компонентами.

Менеджер FlowLayout ориентирован по горизонтали. Если необходима вертикальная компоновка, нужно написать свой собственный менеджер (или использовать менеджер BoxLayout из библиотеки Swing).

3.2.3. Менеджер GridLayout

Класс GridLayout разделяет контейнер на клетки одинакового размера (по типу таблицы). При добавлении компонентов в контейнер GridLayout конструктор

public GridLayout(int rows, int cols, int hgap, int vgap)

размещает их в клетках слева направо и сверху вниз. Параметры rows и cols задают  количество строк или столбцов таблицы, hgap а и vgap – соответственно промежутки между столбцами и строками. Если задано количество строк, количество столбцов будет вычислено. Если, наоборот, задать количество столбцов, вычисляться будет количество строк. Если добавить шесть компонентов в объект GridLayout, содержащий две строки, он создаст три столбца. Если создается GridLayout с заданным числом строк, следует в качестве числа столбцов указать значение 0. Если же надо задать число столбцов, то вместо числа строк следует задать значение 0 (если оба значения ненулевые, будет использоваться только количество строк, а число столбцов будет вычислено, исходя из количества строк и числа компонентов в контейнере). Так предложение

GridLayout myGridLayout = new GridLayout(0, 4, 8, 10);

создает объект GridLayout с четырьмя столбцами, промежутком между столбцами 8 пикселей, а между строками — 10 пикселей. Задание нулевых значений и для rows и для cols приводит к возбуждению исключения IllegalArgumentException.

Можно также создать объект GridLayout с помощью конструктора

public GridLayout(int rows, int cols)

(в этом случае промежутков между столбцами и между строками не будет).

Конструктор

public GridLayout()

задает объект с одной строкой и одной колонкой.

Менеджер GridLayout старается установить размер каждого компонента к максимальной предпочитаемой ширине и максимальной предпочитаемой высоте (все компоненты GridLayout будут одного и того же размера). Поэтому предпочитаемая ширина pw и высота ph для GridLayout рассчитывается по следующей формуле:

pw = (maxPrefWidth * cols) + (hgap * (cols+1))

ph = (maxPrefHeight * rows) + (vgap * (rows+1))

Класс GridLayout, помимо методов интерфейса  LayoutManager, обеспечивает также следующие методы:

public int getAlignment() и public void setAlignment(int align) – получение и установка выравнивания;

public int getVgap() и public void setVgap(int vgap) – получение и установка промежутка по вертикали между компонентами;

public int getHgap() и public void setHgap(int hgap) – получение и установка промежутка по горизонтали между компонентами;

public int getRows() и public void setRows(int rows) – получение и установка количества строк;

public int getColumns() и public void setColumns(int rows) – получение и установка количества столбцов.

3.2.4. Менеджер BorderLayout

Класс BorderLayout разделяет контейнер на пять областей, условно называемых "North" (север), "South" (юг), "East" (восток), "West" (запад) и "Center" (центр).

Этот менеджер используется по умолчанию в объектах класса Frame и его подклассах.

На самом деле из пяти приведенных областей можно использовать, в зависимости от задачи, две или три области.

Менеджер BorderLayout требует ограничителя при добавлении компонент. Ограничитель может быть одной из следующих переменных класса BorderLayout  с модификаторами public static final int: NORTH, SOUTH, EAST, WEST или CENTER. 

Эти ограничители определяются с помощью следующего метода класса Container:

public void add(Component component, Object constraint),

например:

add(new Button("Север"), BorderLayout.NORTH);

Объект  BorderLayout создается с помощью одного из конструкторов:

public BorderLayout()

public BorderLayout(int hgap, int vgap)

где параметры vgap и hgap задают промежутки по вертикали и горизонтали (в случае  конструктора без параметров между компонентами нет промежутков).

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

Менеджер действует по следующему алгоритму:

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

области BorderLayout.EAST и BorderLayout.WEST являются полезными, если необходимо связать ширину компонента с его предпочитаемой шириной;

как только указанные выше компоненты становятся связанными, область BorderLayout.CENTER становится расширяющейся частью.

Предпочитаемая ширина pw компоновки BorderLayout зависит от самой широкой из строк, а предпочитаемая высота ph зависит от размеров компонент NORTH и SOUTH, а также самого высокого из компонент средней строки:

pw = max(north.pw, south.pw,

(west.pw + center.pw + east.pw + hgaps))

ph = vgaps + north.ph + south.ph +

max(west.ph, center.ph, east.ph)

Класс BorderLayout, помимо методов интерфейсов  LayoutManager и LayoutManager2, обеспечивает также следующие методы:

public int getVgap() и public void setVgap(int vgap) – получение и установка промежутка по вертикали между компонентами;

public int getHgap() и public void setHgap(int hgap) – получение и установка промежутка по горизонтали между компонентами.

3.2.5. Менеджер компоновки BoxLayout

Компоновка BoxLayout в целом подобна стандартной компоновке библиотеки AWT FlowLayout, за исключением того, что при работе с новой компоновкой можно определить используемую ось (с помощью статических переменных класса BoxLayout: Х_AXIS или Y_AXIS). В отличие от компоновки GridLayout, здесь каждый компонент может занимать ячейку различного размера. Для использования компоновки BoxLayout с ориентацией по оси Y достаточно поместить в программу следующий оператор:

setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

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

Так, в число размещаемых на панели компонентов можно включить невидимые компоненты-заполнители трех видов.

Первый вид заполнителя – невидимая разделительная область (rigid area), имеющая фиксированные размеры. Она создается с помощью метода

public static Component createRigidArea(Dimension d)

и вставляется между компонентами, создавая промежуток фиксированного размера между ними.

Заполнитель второго вида – невидимая «распорка» (strut) имеет только один фиксированный размер. У горизонтальной распорки, создаваемой статическим методом

public static Component createHorizontalStrut(int width)

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

У вертикальной распорки, создаваемой статическим методом

public static Component createVerticalStrut(int height)

фиксирована высота. Она используется аналогично горизонтальной распорке.

Третий вид заполнителя – невидимая «надувная подушка» (glue), «раздуваясь», заполняет все выделенное ей пространство, раздвигая остальные компоненты и прижимая их к краям панели, если они имеют фиксированный максимальный размер. Этот заполнитель создается одним из статических методов:

public static Component createGlue() – «подушка» раздувается во все стороны;

public static Component createHorizontalGlue() – «подушка» раздается в ширину;

public static Component createVerticalGlue() – «подушка» раздается в высоту.

Кроме этих трех компонентов-разделителей можно использовать невидимый компонент с фиксированным минимальным, максимальным и предпочтительным размерами. Он является объектом класса Filler, вложенного в класс Box, и создается конструктором

Box.Filler(Dimension min, Dimension pref, Dimension max).

Преимущество этого объекта в том, что он может поменять размеры с помощью метода

void changeShape(Dimension min, Dimension pref,

Dimension max).

3.2.6. Менеджер компоновки SpringLayout

Менеджер компоновки SpringLayout использует для определения положения и размеров компонента использует координаты x, у и размерами width, height, задаваемыми объектами абстрактного класса Spring.

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

public static Spring constant(int min, int pref, int max),

с заданным минимальным, предпочитаемым и максимальным значениями, а метод

public static Spring constant(int size)

возвращает объект класса Spring с совпадающими между собой размерами, равными size.

Текущий размер value, устанавливается методом

public abstract void setValue(int value).

Минимальный, максимальный, предпочитаемый и текущий размер можно получить с помощью методов  

public abstract int getMinimumValue(),

public abstract int getMaximumValue(),

public abstract int getPreferredValue(),

public abstract int getValue().

При использовании менеджером SpringLayout нескольких объектов класса для учета их  взаимодействия в классе Spring определены несколько методов.

Так, метод

public static Spring max(Spring s1, Spring s2)

возвращает новый объект, размеры которого составлены из наибольших значений объектов s1 и s2, метод

public static Spring minus(Spring s)

возвращает новый объект, размеры которого равны размерам объекта s с обратным знаком, а метод

public static Spring sum(Spring s1, Spring s2)

возвращает новый объект, размеры которого равны сумме соответствующих размеров объектов s1 и s2.

Объект класса Spring используется для построения объекта вложенного класса SpringLayout.Constraints.

Объект этого класса содержит координаты x и у, ширину width и высоту height, являющиеся объектами класса Spring. Менеджер размещения SpringLayout меняет положение левого верхнего угла компонента в заданных объектами x и y пределах. Поэтому координаты обозначаются статическими строковыми константами WEST и NORTH класса SpringLayout. Величины x + width и y + height обозначаются статическими строковыми константами EAST и SOUTH и определяют положение правого нижнего угла компонента.

Для получения и установки всех этих значений в классе SpringLayout.Constraints определены методы:  

  •  void setX(Spring x)и Spring getX()  установка и получение координаты x;
  •  void setY(Spring y)и Spring getY()  установка и получение координаты y;
  •  void setWidth(Spring width)и Spring getWidth()  установка и получение ширины;
  •  void setHeight(Spring height)и Spring getHeight()– установка и получение высоты.

Методы 

public void setConstraint(String edgeName, Spring s)

и 

public Spring getConstraint(String edgeName)

устанавливают и выдают объект класса Spring по заданному имени NORTH, WEST, SOUTH или EAST.

3.2.7. Менеджер компоновки GroupLayout

Менеджер GroupLayout иерархически группирует компоненты для их позиционирования в контейнере и поддерживает два типа групп. Группы первого типа выстраивают свои элементы последовательно, группы второго типа – параллельно четырьмя разными способами.  Группирование выполняется с помощью объектов класса Group.

Каждая группа может содержать любое количество объектов класса Group или Component, а также промежуток (gap). Компоненты менеджера похожи на пружины. Каждый компонент имеет диапазон размеров, задаваемый  минимальным, предпочитаемым и максимальным размерами, определяемыми с помощью методов getMinimumSize(), getPreferredSize() и getMaximumSize() класса Component. Промежуток также рассматривается как невидимый компонент с минимальным, предпочитаемым и максимальным размером. Кроме того, менеджер поддерживает предпочитаемый промежуток, который можно получить с помощью метода getPreferredGap() класса LayoutStyle.

Диапазон для объекта класса определяется типом группы: для последовательных групп диапазон равен сумме элементов, для параллельных – диапазону для максимального элемента.

Менеджер GroupLayout рассматривает каждую ось независимо, т.е. существует группа, представляющая вертикальную ось и группа, представляющая горизонтальную ось. Вертикальная ось определяет минимальный, предпочитаемый и максимальный размер по этой оси, установку координаты y и высоты компонент, а горизонтальная ось – минимальный, предпочитаемый и максимальный размер по этой оси, установку координаты x и ширины компонент. Каждый компонент должен быть задан и в вертикальной и в горизонтальной группе.

Конструктор 

public GroupLayout(Container host)

задает групповую компоновку для контейнера host.

Метод 

public void setAutoCreateGaps(boolean autoCreatePadding)

задает (при значении параметра autoCreatePadding, равном true) или отменяет (при значении параметра autoCreatePadding, равном false) автоматическую вставку промежутков между компонентами.

Горизонтальная и вертикальная группы создаются с помощью методов

public void setHorizontalGroup(GroupLayout.Group group)

public void setVerticalGroup(GroupLayout.Group group)

Оба эти метода содержат в качестве параметра объект group вложенного класса Group, который задает позиции и размеры компонент вдоль горизонтальной или вертикальной оси.

Последовательная или параллельная группы создаются с помощью методов

public GroupLayout.SequentialGroup createSequentialGroup()

public GroupLayout.ParallelGroup createParallelGroup()

public GroupLayout.ParallelGroup createParallelGroup(

GroupLayout.Alignment alignment)

GroupLayout.ParallelGroup createParallelGroup(

GroupLayout.Alignment alignment, boolean resizable)

Предпоследний и последний методы задают (с помощью параметра alignment) выравнивание компонент в группе с помощью перечислимых переменных класса GroupLayout.Alignment: LEADING (выравнивание к началу группы), TRAILING (выравнивание к концу группы), CENTER (выравнивание по центру) и BASELINE (выравнивание по базовой линии). Последний метод задает также (с помощью параметра resizable) возможность изменения размера компонента.

Методы

public void linkSize(Component... components)

public void linkSize(int axis, Component... components)

позволяют установить одинаковый размер для всех заданных в качестве параметров компонент группы (второй метод – только для заданной оси, которая задается статическими константами HORIZONTAL и VERTICAL класса SwingConstants)/

3.3. Обработка событий в Java

3.3.1. Модель делегирования событий в Java

Операционная система, например Microsoft Windows, отслеживает все события, происходящие в системе. Система направляет эти события в соответствующие целевые объекты. Если, к примеру, пользователь щелкает по окну апплета, система создает событие mouse-down (нажатие клавиши мыши) и отсылает его данному окну для обработки. Затем это окно может выполнить некоторую операцию или попросту передать событие обратно системе для обработки по умолчанию.

В языке Java события представляют собой объекты некоторых классов.

В JDK 1.0 существовал единственный класс   Event, описывающий все  события, на которые программа может реагировать, а также определяющий методы по умолчанию для получения информации о конкретном событии.

Начиная с JDK 1.1, в Java были изменена модель обмена информацией о событиях, названная моделью делегирования событий. Старая модель и класс Event были сохранены для возможности использования старых программ, однако использовать старую модель не рекомендуется.

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

События, как и исключения, образуют иерархию классов. Корнем этой иерархии является класс EventObject, расширяющий класс Object.

Для класса определены два метода

public Object getSource()

и

public String toString(),

определяющие соответственно объект – источник события и строковое представление объекта-события.

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

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

Низкоуровневые события связаны с физическими аспектами интерфейса пользователя – щелчками мыши, нажатиями клавиш клавиатуры и т.д. Низкоуровневые события обрабатывает класс ComponentEvent и его потомки.

Семантические события строятся на базе низкоуровневых событий. Например, для выбора команды меню может потребоваться раскрыть список команд первым щелчком мыши, а затем вторым щелчком выбрать в нем требуемую команду. Эта последовательность низкоуровневых событий может быть объединена в одно семантическое событие. Все остальные события, кроме событий ветви ComponentEvent, являются семантическими (эти компоненты будут рассмотрены далее).

3.3.2. Классы и интерфейсы обработки низкоуровневых событий

В каждом классе событий определены соответствующие свойства и методы для обработки событий.

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

Рассмотрим основные свойства и методы классов низкоуровневых событий и соответствующих им блоков прослушивания.

3.3.2.1. Класс ComponentEvent и интерфейс ComponentListener 

Класс ComponentEvent обрабатывает события, связанные с изменением компонента. Причину изменения можно определить  с помощью следующих статических final переменных класса типа int:

  •  COMPONENT_MOVED – компонент переместился;
  •  COMPONENT_RESIZED – компонент изменил размер;
  •  COMPONENT_HIDDEN – компонент убран с экрана;
  •  COMPONENT_SHOWN – компонент появился на экране;
  •  COMPONENT_FIRST – первый номер в списке идентификаторов, используемых для событий компонента;
  •  COMPONENT_LAST – последний номер в списке идентификаторов, используемых для событий компонента.

Метод класса

public Component getComponent()

возвращает компонент – источник события.

Интерфейс ComponentListener содержит объявления следующих методов обработки событий компонент:

  •  public void componentResized(ComponentEvent e) – обработка события изменения размера компонента;
  •  public void componentMoved (ComponentEvent e) – обработка события перемещения компонента;
  •  public void componentShown(ComponentEvent e) – обработка события появления компонента на экране;
  •  public void componentHidden(ComponentEvent e) – обработка события удаления компонента с экрана.

3.3.2.2. Класс ContainerEvent и компонент ContainerListener

Класс ContainerEvent обрабатывает события добавления или удаления компонента и содержит следующие статические final переменные типа int:

  •  COMPONENT_ADDED – в контейнер добавлен компонент;
  •  COMPONENT_REMOVED – из контейнера удален компонент;
  •  CONTAINER_FIRST – первый номер в списке идентификаторов, используемых для событий контейнера;
  •  CONTAINER_LAST – последний номер в списке идентификаторов, используемых для событий контейнера.

Методы класса

public Component getChild()

public Container getContainer()

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

Интерфейс ContainerListener содержит объявления следующих методов:

  •  public void componentAdded(ContainerEvent e) – обработка события добавления компонента в контейнер;
  •  public void componentRemoved(ContainerEvent e) – обработка события удаления компонента из контейнера.

3.3.2.3. Класс FocusEvent и интерфейс FocusListener

Класс FocusEvent обрабатывает события приобретения или потери фокуса и содержит следующие статические final переменные типа int:

  •  FOCUS_GAINED – получение фокуса ввода;
  •  FOCUS_LOST – потеря фокуса ввода;
  •  FOCUS_FIRST – первый номер в списке идентификаторов, используемых для событий фокуса;
  •  FOCUS_LAST – последний номер в списке идентификаторов, используемых для событий фокуса.

Метод класса

public Component getOppositeComponent()

возвращает другой компонент, связанный со сменой фокуса, а метод

public boolean isTemporary()

возвращает true, если событие, связанное с изменением фокуса, является временным и false – в противном случае.

В интерфейсе FocusListener содержатся объявления двух методов:

  •  public void focusGained(FocusEvent e) – обработка события получения фокуса;
  •  public void focusLost(FocusEvent e) – обработка события потери фокуса.

3.3.2.4. Класс WindowEvent и интерфейсы WindowListener, WindowStateListener и WindowFocusListener

Класс WindowEvent обрабатывает события, связанные с изменением состояния окна и содержит следующие статические final переменные типа int:

  •  WINDOW_OPENED – окно открылось;
  •  WINDOW_CLOSED –  окно закрылось;
  •  WINDOW_CLOSING – попытка закрытия окна;
  •  WINDOW_ACTIVATED – окно получило фокус;
  •  WINDOW_DEACTIVATEDокно потеряло фокус;
  •  WINDOW_ICONIFIED – окно свернулось в ярлык;
  •  WINDOW_DEICONIFIED – окно развернулось;
  •  WINDOW_GAINED_FOCUS – окно получило фокус;
  •  WINDOW_LOST_FOCUS – окно потеряло фокус;
  •  WINDOW_STATE_CHANGED – любое изменение состояния окна из перечисленных выше;
  •  WINDOW_FIRST – первый номер в списке идентификаторов, используемых для событий окна;
  •  WINDOW_LAST – последний номер в списке идентификаторов, используемых для событий окна.

Методы класса

public int getNewState()

public int getOldState()

для события WINDOW_STATE_CHANGED возвращает новое или предыдущее состояние окна. Возвращаемое значение можно сравнивать на равенство со следующими статическими целыми final переменными класса Frame:

  •  NORMAL – нормальное состояние окна;
  •  ICONIFIED – свернутое окно;
  •  MAXIMIZED_HORIZ – увеличение до максимального размера по горизонтали;
  •  MAXIMIZED_VERT – увеличение до максимального размера по вертикали;
  •  MAXIMIZED_BOTH – увеличение до максимального размера по горизонтали и вертикали.

Методы

public Window getOppositeWindow()

public Window getWindow()

возвращает соответственно другое окно, которое затронуло данное событие и окно – источник события.

Интерфейс WindowListener содержит объявления следующих методов обработки событий окна:

  •  public void windowOpened(WindowEvent e)обработка открытия окна;
  •  public void windowClosing(WindowEvent e) обработка попытки закрытия окна;
  •  public void windowClosed(WindowEvent e)обработка закрытия окна;
  •  public void windowIconified(WindowEvent e) обработка сворачивания окна;
  •  public void windowDeiconified(WindowEvent e)обработка разворачивания окна;
  •  public void windowActivated(WindowEvent e)обработка активизации окна;
  •  public void windowDeactivated(WindowEvent e)обработка деактивизации окна.

Начиная с версии 1.4 добавлены два новых интерфейса для обработки событий окна.

Интерфейс WindowStateListener, содержит объявление метода

public void windowStateChanged(WindowEvent e),

который обрабатывает событие изменения окна.

Второй интерфейс WindowFocusListener содержит объявления следующих двух методов:

  •  public void windowGainedFocus(WindowEvent e) – обработка события приобретения окном фокуса;
  •   public void windowLostFocus(WindowEvent e) – обработка события потери окном фокуса.

3.3.2.5. Класс InputEvent

Класс InputEvent является корневым классом для всех событий ввода уровня компонента. События ввода направляются блокам прослушивания до их обычной обработки источником, который вызвал данное событие. Это позволяет блокам прослушивания и подклассам компонент «потреблять» событие так, чтобы источник не обрабатывал их обычным образом. Например, «потребление» события нажатия кнопки предотвращает активизацию кнопки.

Класс содержит следующие статические final переменные типа int, которые используются при обработки событий мыши и клавиатуры:

  •  BUTTON1_DOWN_MASK, BUTTON2_DOWN_MASK и BUTTON3_DOWN_MASK – нажатие  соответственно первой, второй или третьей кнопки мыши;
  •  CTRL_DOWN_MASK, ALT_DOWN_MASK и SHIFT_DOWN_MASK – нажатие соответственно клавиш Ctrl, Alt или Shift.

Методы класса

public void consume()

public boolean isConsumed()

соответственно «потребляет» событие так, чтобы оно не обрабатывалось обычным образом и проверяет, не использовалось ли потребление события.

Методы

public int getModifiers()

public static String getModifiersExText(int modifiers)

соответственно возвращает модификатор для данного события (его значение совпадает с одной из определенных выше переменных)  и получает текстовое значение для нажатых клавиш модификаторов, например, "Shift", "Button1" или "Ctrl+Shift".

Метод

public int getModifiersEx()

позволяет получить расширенные значения модификаторов, которые представляют состояние всех клавиш-модификаторов и кнопок мыши.

Метод

public long getWhen()

позволяет получить отметку о времени возникновения события (в миллисекундах с 1 января 1970 года).

Методы

public boolean isAltDown()

public boolean isControlDown()

public boolean isShiftDown()

позволяют определить были ли нажаты соответственно клавиши Alt, Ctrl или Shift во время возникновения события.   

3.3.2.6. Класс KeyEvent и интерфейс KeyListener

Класс KeyEvent обрабатывает события клавиатуры и содержит следующие статические final переменные типа int:

  •  KEY_PRESSED – клавиша нажата;
  •  KEY_RELEASED – клавиша отпущена;
  •  KEY_TYPED – введен символ;
  •  KEY_LOCATION_LEFT – клавиша расположена слева на клавиатуре (для нескольких одинаковых клавиш);
  •  KEY_LOCATION_RIGHT – клавиша расположена справа на клавиатуре (для нескольких одинаковых клавиш);
  •  KEY_LOCATION_NUMPAD – клавиша расположена на цифровой клавиатуре (для нескольких одинаковых клавиш);
  •  KEY_LOCATION_STANDARD – положение клавиши стандартное (для тех клавиш, у которых нет совпадающих с ними клавиш);
  •  KEY_LOCATION_UNKNOWN – положение клавиши не определилось (обычно для события  KEY_TYPED).

Кроме того,  в классе KeyEvent определены коды всех клавиш в виде констант, называемых виртуальными кодами клавиш (virtual key codes), например, VK_F1, VK_SHIFT, VK_A, VK_B, VK_PLUS. Они перечислены в документации к классу KeyEvent. Фактическое значение виртуального кода зависит от языка и раскладки клавиатуры.

Методы класса

public char getKeyChar()

public int getKeyCode()

getKeyLocation()

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

Методы

public static String getKeyText(int keyCode)

public static String getKeyModifiersText(int modifiers)

возвращают соответственно строку, описывающую клавишу, например, "HOME", "F1" или "A".и текст, описывающий клавишу-модификатор, например, "Shift" или "Ctrl+Shift".

Метод

public boolean isActionKey()

проверяет, не является ли клавиша, вызвавшая событие клавишей «действия» (обычно клавиши «действия» – это   клавиши, которые не   являются клавишами символов или клавишами модификаторов, например, клавиша Esc).

Методы

public void setKeyChar(char keyChar)

public void setKeyCode(int keyCode)

public void setModifiers(int modifiers)

позволяет установить соответственно значение символа, кода и клавиши-модификатора.

Кроме указанных свойств и методов, класс KeyEvent наследует все свойства и методы класса InputEvent.

Интерфейс KeyListener содержит объявления следующих методов:

  •  public void keyTyped(KeyEvent e) – обработка события ввода символа;
  •  public void keyPressed(KeyEvent e) – обработка события нажатия клавиши;
  •  public void keyReleased(KeyEvent e) – обработка события отпускания клавиши.

3.3.2.7. Класс MouseEvent и интерфейсы MouseListener и MouseMotionListener 

Класс MouseEvent обрабатывает события клавиатуры и содержит следующие статические final переменные типа int:

  •  MOUSE_PRESSEDнажатие кнопки мыши;
  •  MOUSE_RELEASED –  отпускание кнопки мыши;
  •  MOUSE_CLICKED –   щелчок кнопкой мыши;
  •  MOUSE_MOVED –   перемещение мыши;
  •  MOUSE_DRAGGED –   перемещение мыши с нажатой кнопкой;
  •  MOUSE_ENTERED –   появление курсора мыши в компоненте;
  •  MOUSE_EXITED –   выход курсора мыши из компонента;
  •  BUTTON1,  BUTTON2 и BUTTON3 – первая, вторая и третья кнопки мыши;
  •  MOUSE_WHEEL – вращение колесика мыши;
  •  NOBUTTON –   кнопка мыши не использовалась во время события;
  •  MOUSE_FIRST – первый номер в списке идентификаторов, используемых для событий мыши;
  •  MOUSE_LAST – последний номер в списке идентификаторов, используемых для событий мыши.

Методы класса 

public int getButton()

public int getClickCount()

позволяют определить соответственно, какая кнопка была нажата и количество щелчков кнопки.

Методы

public Point getPoint()

public int getX()

public int getY()

определяет точку экрана, в которой произошло событие мыши или отдельно координаты x и y точки.

Метод

public boolean isPopupTrigger()

позволяет определить, является ли событие мыши событием вызова контекстного («всплывающего») меню (для Windows это нажатие правой кнопки мыши).

Метод

public static String getMouseModifiersText(int modifiers)

возвращает строку, идентифицирующую клавишу-модификатор (например, "Shift"), если она была нажата одновременно с кнопкой мыши.

Метод

public void translatePoint(int x, int y)

переводит точку координаты точки на экране, в которой произошло событие мыши, в новую позицию с горизонтальным смещением x и вертикальным смещением y.

Кроме указанных свойств и методов, класс MouseEvent наследует все свойства и методы класса InputEvent.

В интерфейсе MouseListener объявлены следующие методы:

  •  public void mouseClicked(MouseEvent e)обработка события щелчка мыши;
  •  public void mousePressed(MouseEvent e)обработка события нажатия кнопки мыши;
  •  public void mouseReleased(MouseEvent e)обработка события отпускания кнопки мыши;
  •  public void mouseEntered(MouseEvent e)обработка события входа курсора мыши в компонент;
  •  public void mouseExited(MouseEvent e) – обработка события выхода курсора мыши из компонента.

Интерфейс MouseMotionListener содержит объявления следующих методов:

  •  public void mouseDragged(MouseEvent e) – обработка события перемещения мыши при нажатой кнопке;
  •  public void mouseMoved(MouseEvent e) – обработка события перемещения мыши (при не нажатой кнопке мыши).

3.3.2.8. Класс MouseWheelEvent и интерфейс MouseWheelListener

Класс MouseWheelEvent обрабатывает события, связанные с вращением колесика мыши. Две статические final переменные типа int:

WHEEL_UNIT_SCROLL

WHEEL_BLOCK_SCROLL

представляют прокручивание колесика в «единицах» (как перемещение с помощью клавишей стрелок) и в «блоках» (как перемещение с помощью клавиш PageUp и PageDown).

Методы класса

public int getScrollType()

public int getScrollAmount()

public int getWheelRotation()

public int getUnitsToScroll()

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

Интерфейс MouseWheelListener  объявляет метод

public void mouseWheelMoved(MouseWheelEvent e)

для обработки события вращения колесика мыши.

3.3.3. Классы и интерфейсы обработки высокоуровневых событий

3.3.3.1. Интерфейс ActionListener и класс ActionEvent 

Для классов  JButton,  JList и  JTextField определен блок прослушивания ActionListener с единственным методом

public void actionPerformed(ActionEvent e),

вызываемым, когда происходит действие для заданного объекта класса Button,  List или  TextField.

Класс ActionEvent обрабатывает события, связанные с нажатием кнопки, выбором элемента из списка или с нажатием клавиши Enter в текстовом поле.

Для класса ActionEvent определены следующие статические final переменные типа int:

  •  ACTION_PERFORMED – действие произошло;
  •  ALT_MASK –  нажата клавиша Alt;
  •  SHIFT_MASK – нажата клавиша Shift;
  •  CTRL_MASK – нажата клавиша Ctrl;
  •  ACTION_FIRST – первый номер в списке идентификаторов, используемых для событий действия;
  •  ACTION_LAST – последний номер в списке идентификаторов, используемых для событий действия.

Методы

public String getActionCommand()

public int getModifiers()

public long getWhen()

public String paramString()

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

3.3.3.2. Интерфейсы ItemListener, ItemSelectable и класс ItemEvent

Для классов  JComboBox,  JCheckbox,  JRadioButton и  JList определен блок прослушивания ItemListener с единственным методом

public void itemStateChanged(ItemEvent e),

вызываемым, когда происходит выбор или отмена выбора элементов в объектах класса Choice,  Checkbox или  List.

Класс ItemEvent содержит переменные и методы для обработки события, связанные с выбором элемента или отменой выбора элемента.

Для класса ItemEvent определены следующие статические final переменные типа int:

  •  SELECTED – элемент выбран;
  •  DESELECTED – выборка элемента отменена;
  •  ITEM_STATE_CHANGED – состояние элемента изменено;
  •  ITEM_FIRST – первый номер в списке идентификаторов, используемых для событий выбора элемента;
  •  ITEM_LAST – последний номер в списке идентификаторов, используемых для событий выбора элемента.

Методы

public Object getItem()

public int getStateChange()

public String paramString()

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

Метод

public ItemSelectable getItemSelectable()

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

public void addItemListener(ItemListener l)

public void removeItemListener(ItemListener l)

для добавления и удаления блоков прослушивания выбора или отмены выбора элементов из списка, а также метод

public Object[] getSelectedObjects(),

который должен возвращать массив выбранных объектов или null, если не выбрано ни одного объекта.

3.3.4. Обработка событий в Java

Чтобы блок прослушивания мог фиксировать и обрабатывать события он должен быть включен с помощью методов добавления блоков прослушивания в класс (эти методы определены в классе Component).

Методы включения блоков прослушивания имеют следующий общий формат:

public void addXXXX (XXXX l)

Где XXXX – имя соответствующего блока прослушивания, например включение в класс блока прослушивания для событий клавиатуры реализуется с помощью метода

public void addKeyListener (KeyListener l).

Таким образом, для обработки события в каком либо классе необходимо:

  1.  Сделать доступным методы, определенные в соответствующем интерфейсе или интерфейсах, объявив класс как реализацию (implementation) соответствующего интерфейса или интерфейсов.
  2.  Включить необходимые блоки прослушивания с помощью соответствующего метода addXXXX.
  3.  Описать в программе все методы всех реализуемых интерфейсов (если какой-либо метод не используется в классе, он объявляется с пустым телом – {}). В методах интерфейсов обычно используются методы и свойства соответствующего класса обработки событий.

Скелет программы (для обработки событий клавиатуры) представлен ниже:

class KeyTest implements KeyListener

{

...

addKeyListener(имя-объекта-KeyListener);

...

public void keyPressed(KeyEvent e)

{

 // Обработка события нажатия клавиши или пусто

}

public void keyReleased(KeyEvent e)

{

 // Обработка события отпускания клавиши или пусто

}

public void keyTyped(KeyEvent e)

{

// Обработка ввода символа или пусто

}

Как видно из предыдущего примера, необходимо описывать метод, даже если он не используется. Для  того, чтобы в классе можно было описывать только те методы, которые необходимо, в JDK были введены специальные абстрактные классы – адаптеры, содержащие объявления тех же методов, что и соответствующие блоки прослушивания. Имена этих классов формируются так же, как и блоков прослушивания, только вместо суффикса Listener в них используется суффикс Adapter, например, KeyAdapter или MouseAdapter.

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

addKeyListener(new myKeyAdapter());

Более компактной записью, которая часто используется программистами на Java, является непосредственное определение безымянного внутреннего класса в параметре соответствующего метода addXXXX, например:

addKeyListener

(

         new KeyAdapter()

  {

   // Описание методов класса KeyAdapter

  }

);

3.4. Программирование графических приложений в NetBeans IDE 6.1

3.4.1. Создание графического приложения

Для создания графического приложения необходимо открыть новый проект с помощью команды New Project меню File или кнопки на панели инструментов. В окне в поле Categories выбирается пункт General, а в поле Projects – пункт Java Application. После нажатия кнопки Next в окне New Java Application в поле Project Name задается имя проекта, а в поле Project Location – путь к папке проекта. Переключатель Set as Main Project должен быть включен, а переключатель Create Main Class – выключен. После нажатия кнопки Finish создается новый проект.

В контекстном меню нового проекта выберите команду New и в меню этой команды выберите команду JFrame Form. В поле Class Name окна New JFrame Form задайте имя класса графической формы и нажмите кнопку Finish.

3.4.2. Проектирование графического приложения

После создания графической формы в панели инструментов окна редактора появляются кнопки Source (для просмотра и редактирования исходного текста программы) и Design (создание и редактирование формы в графическом режиме).  В левой части экрана появляется окно Palette (Палитра) с компонентами Swing и окно Properties (Свойства) (если этих окон нет на экране, их можно вывести с помощью команд Palette и  Properties меню Window).

В окне Properties выводятся свойства  выделенного компонента Swing (в начале это свойства компонента JForm). Для компонента JForm можно задать свойство title (наименование окна графического приложения) и изменить свойство background (цвет фона окна).

Проектирование графического приложения в среде NetBeans IDE 6.1 включает в себя следующие этапы:

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

3.4.2.1. Вставка графических компонент в окно приложения

Результат вставки графических компонент в окно приложения приведен на рис. 3.4.1.

Рис. 3.4.1. Окно проектирования графического приложения

При этом в окне Inspector (Инспектор) будет выводиться иерархическая структура графических компонентов приложения (рис. 3.4.2).

Рис. 3.4.2. Иерархическая структура графических компонент

для окна приложения на рис. 3.4.1

При перетаскивании графический компонент будет либо в том месте окна, куда он помещен («свободное» проектирование, как для содержимого панелей jPanel1 и jPanel2), либо в соответствии с заданным менеджером компоновки (как для содержимого панели jPanel3). Для выбора менеджера компоновки надо выделить компонент-контейнер (например, JForm или JPanel) и в контекстом меню задать в команде Set Layout наименование менеджера компоновки для этого компонента.

При вставке компонент в окно приложения им автоматически присваиваются имена (например, JMenu1, JMenu2  и т.д.). Имя графического компонента можно изменить, если вызвать контекстное меню для этого компонента в окне проектирования или в окне  и в диалоговом окне команды Change Variable Name задать новое имя компонента.

Отредактировать текст для компонентов с текстом (например, JTextField или JButton) можно в диалоговом окне команды Edit Text контекстного меню.

Предварительный просмотр окна приложения можно выполнить с помощью кнопки  Preview Design на панели инструментов проектирования.

3.4.2.2. Выполнение операций над компонентами

При использовании «свободного» проектирования графические компоненты можно выравнивать относительно друг друга. Для этого эти компоненты необходимо выделить, щелкая по ним мышью при нажатой клавише Ctrl, а затем применить к ним одну или несколько операций выравнивания с помощью команд подменю команды Align контекстного меню, либо с помощью кнопок на панели инструментов.

Команда Left to Column или кнопка выравнивает компоненты слева, а команда Right to Column или кнопка справа по отношению к вертикальной линии (столбцу).

Команда Top to Row или кнопка выравнивает компоненты вверх, а команда Bottom to Row или кнопка вниз по отношению к горизонтальной линии (строке).

Команда Center horizontally или кнопка выравнивает компоненты а команда Center vertically или кнопка по центру вертикально.

Привязка компонент к границам контейнера задается с помощью команд подменю команды Anchor контекстного меню.

Выделенные компоненты можно сделать одинакового размера, если в команде Same Size контекстного меню включить один или оба переключателя (Same Width и Same Height). Для возврата к размеру по умолчанию для выделенных компонент надо выполнить команду Set Default Size  контекстного меню.

Для возможности автоматического изменения размеров выделенных компонент при выполнении приложения надо либо нажать кнопки и/или для изменений по горизонтали и вертикали, либо включить один или оба переключателя (Horizontal и Vertical) в команде Auto Resizing контекстного меню.

Свободное пространство вокруг компонента и возможности его изменения можно задать в диалоговом окне команды Space Around Component контекстного меню.

С помощью команд контекстного меню Move Up и Move Down контекстного меню можно переместить компоненты вверх или вниз по иерархической структуре. В окне Inspector переместить компоненты можно, просто перетащив их на новое место.

Вырезать, скопировать, вставить или удалить выделенные компоненты можно с помощью команд Cut, Copy и Delete контекстного меню. Вставка вырезанных или скопированных компонент в то место, где находится курсор мыши, выполняется с помощью команды Paste (вставленный компонент будет иметь те же свойства, что и оригинальный компонент, но при этом компоненту будет присвоено новое имя).

3.4.2.3. Изменение свойств компонент

После вставки компонента ему можно изменить свойства. Эта операция выполняется для выделенного компонента в окне Properties.

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

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

Таблица 3.4.1. Наиболее часто используемые свойства для разных групп компонент

Свойство

Группа компонент

Назначение

background

Практически все компоненты

Установка цвета фона.

font

Компоненты, содержащие текст

Установка шрифта для текста.

text

Компоненты, содержащие текст

Задание текста, выводимого в компоненте.

foreground

Компоненты, содержащие текст

Задание цвета текста, выводимого в компоненте.

horizontalAlignment

Компоненты, содержащие текст

Задает выравнивание текста в компоненте.

toolTipText

Все компоненты

Задание текста подсказки, выводимого при наведении курсора мыши на компонент.

border

Практически все компоненты

Задание вида и параметров рамки вокруг компонента.

buttonGroup

JCheckBox, JRadioButton, JButton

Задание группы, к которой относится компонент.

selected

JCheckBox, JRadioButton

Задание выбора для компонента.

icon

JLabel, JButton

Задание изображения для компонента.

model

JComboBox, JList, JSpinner

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

selectedItem

JComboBox, JList, JSpinner

Задание предварительно выбранного элемента в списке.

editable

JComboBox, JTextField, JTextArea,

JTextPane

Задание возможности редактирования содержимого компонента.

columns, rows

JTextArea

Задание количества столбцов и строк в текстовой области.

selectionMode

JList

Задание возможности множественного выбора в списке.

maximum, minimum

JSlider

Задание максимального и минимального значений для ползунка.

majorTickSpacing,

minorTickSpacing

JSlider

Задание количества единиц в большой и малой рисках шкалы ползунка.

value

JSlider

Задание начального значения для ползунка.

dividerLocation,

dividerSize,

orientation

JSplitPane

Задание местоположения разделителя, его размера (толщины) и ориентации (горизонтальной или вертикальной).

oneTouchExpandable

JSplitPane

Задание возможности управления выводом расщепленных панелей.

caretColor

caretPosition

JTextPane

Задание цвета и позиции курсора в окне панели.

Для создания группы компонент надо перетащить в окно проектирования компонент  ButtonGroup (нового компонента в окне при этом не появится, а появится соответствующий компонент в окне Inspector). Для добавления какого-либо компонента в группу надо в этом компоненте в свойстве buttonGroup выбрать наименование группы.

При создании вращающегося списка с числовыми значениями надо в диалоговом окне свойства model нажать кнопку Advanced, затем в открывшемся диалоговом окне включить переключатель Generate Pre-initialization Code ввести предложение создания объекта класса SpinnerNumberModel, например:

yearModel = new SpinnerNumberModel(1990, 1900, 2007, 1);

и нажать кнопку OK. После этого в диалоговом окне свойства model нажать радиокнопку User Code и ввести в текстовой области имя объекта (например, yearModel).

Если для вращающегося списка задается строковая модель, то предварительно должен быть задан массив строк (например, months), а затем в окне Advanced вводится предложение создания объекта класса SpinnerListModel, например:

monthModel = new SpinnerListModel(months);

и нажимается кнопка OK, а затем, так же, как и в предыдущем случае, в текстовой области имя вводится объекта (например, monthModel).

3.4.2.4. Программирование обработки событий

Создание метода обработки события для выделенного компонента выполняется с помощью команды Events контекстного меню объекта. В подменю этой команды сначала выбирается событие, например Action (класс   ActionEvent) или  Mouse (класс   MouseEvent). Затем в подменю события выбирается соответствующий метод класса (для класса – это единственный метод actionPerformed, а для класса Mouse – один из методов: MouseClicked, MouseEntered, MouseExited, MousePressed или MouseReleased).

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

Метод обработки события можно также создать, используя вкладку Events окна Properties для выделенного компонента. Сначала выбирается один из методов обработки события, а затем (после нажатия кнопки ) в диалоговом окне задается имя метода-обработчика (handler) данного события. Таким образом, можно задать один метод-обработчик для нескольких компонент.

3.4.2.5. Задание дополнительного программного кода для компонента

Используя вкладку Code окна Properties для выделенного компонента, можно задать дополнительный программный код для компонента: до создания компонента (Pre-Creation Code), после создания (Post-Creation Code), до инициализации компонента (Pre-Init Code) и после инициализации (Post-Init Code), а также задать свой код для создания компонента (Custom Creation Code). Кроме того, можно изменить наименования объекта (Variable Name) для компонента и задать свои модификаторы для объекта (Variable Modifiers).

4. Порядок выполнения работы

Создать графическое приложение с использованием средств проектирования пакета NetBeans IDE 6.1.

Вариант 4-01

Ввод текста в графическое окно приложения. В окне определена строка меню  (JMenuBar), в которой определены два меню (JMenu)  – "Шрифт" и "Стиль". В меню "Шрифт" определены три пункта меню (JRadioButtonMenuItem): "Times New Roman" (шрифт по умолчанию),  "Arial" и "Verdana".  В меню "Стиль" определены четыре пункта меню (JRadioButtonMenuItem): "Простой" (шрифт по умолчанию),  "Жирный", "Курсив" и "Жирный курсив". В текстовой панели (JTextPane) "Ввод текста" окна приложения вводится текст, набираемый на клавиатуре.

При выборе одного из пунктов меню текст в панели выводится соответствующим шрифтом и/или стилем.           

Вариант 4-02

Ввод текста в графическое окно приложения. В верхней панели (JPanel) окна "Характеристики шрифта" определены следующие компоненты: надпись (JLabel) "Шрифт:", раскрывающееся меню  (JComboBox), в котором три пункта: "Times New Roman" (шрифт по умолчанию),  "Arial" и "Verdana",  надпись (JLabel) "Стиль:" и раскрывающееся меню (JComboBox),  в котором четыре пункта: "Простой" (шрифт по умолчанию),  "Жирный", "Курсив" и "Жирный курсив".  В нижней текстовой панели (JTextPane) "Ввод текста" окна приложения вводится текст, набираемый на клавиатуре.

При выборе одного из пунктов меню текст в панели выводится соответствующим шрифтом и/или соответствующего стиля.

Вариант 4-03

Изменение размера фигуры в графическом окне. В окне определена строка меню  (JMenuBar), в которой определены меню (JMenu)  "Параметр" и "Изменение". В меню "Параметр" определены два пункта меню (JCheckBoxMenuItem): "Ширина" (по умолчанию включена)  и "Высота" (по умолчанию включена). В меню "Изменение" определены два пункта меню (JMenuItem): "Увеличить"   и "Уменьшить". В центре панели (JPanel) окна "Вывод изображения" в графическом контексте задается (с помощью метода drawRect()) прямоугольник.    

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

Вариант 4-04

Изменение размера фигуры в графическом окне. В центре верхней панели (JPanel) "Вывод изображения" в графическом контексте задается (с помощью метода drawRect()) прямоугольник.  В нижней панели (JPanel) "Изменение размера" задается надпись (JLabel) "Параметр:", два  переключателя (JCheckBox): "Ширина:" (оба включены по умолчанию) и "Высота:", а также две кнопки (JButton): "Увеличить" и "Уменьшить".  

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

Вариант 4-05

Вывод строки заданным шрифтом и заданного цвета в графическом окне. В верхней панели (JPanel) "Управление выводом" задается  надпись (JLabel) "Текст:" и текстовое поле (JTextField), надпись (JLabel) "Гарнитура:", вращающийся список  (JSpinner) со значениями "Times New Roman" (шрифт по умолчанию),  "Arial" и "Verdana",  надпись (JLabel) "Цвет:" и вращающийся список  (JSpinner) со значениями "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", а также кнопка (JButton) "Вывести строку". В нижней панели (JPanel) "Вывод строки" выводится в графическом контексте (с помощью метода drawString()) в произвольном месте пустая строка.

При задании текста строки в текстовом поле, параметров строки во вращающихся списках  верхней панели и нажатии кнопки "Вывод строки" строка заданного содержимого и цвета выводится заданным шрифтом в нижней панели.

Вариант 4-06

Вывод строки заданным шрифтом и заданного цвета в графическом окне. В верхней панели (JPanel) "Управление выводом" задается  надпись (JLabel) "Строка:" и текстовое поле (JTextField), надпись (JLabel) "Гарнитура:", раскрывающееся меню  (JComboBox), в котором три пункта: "Times New Roman" (шрифт по умолчанию),  "Arial" и "Verdana",  надпись (JLabel) "Цвет:" и раскрывающееся меню (JComboBox),  в котором четыре пункта: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", а также кнопка (JButton) "Вывести строку". В нижней панели (JPanel) "Вывод строки" выводится в графическом контексте (с помощью метода drawString()) в произвольном месте пустая строка.

При задании текста строки в текстовом поле, параметров строки в раскрывающихся меню верхней панели и нажатии кнопки "Вывод строки" строка заданного содержимого и цвета выводится заданным шрифтом в нижней панели.

Вариант 4-07

Вывод фигур в графическом окне. В окне определена строка меню  (JMenuBar), в которой определены два меню (JMenu)  – "Цвет и "Вывод". В меню "Цвет" определены четыре пункта меню (JRadioButtonMenuItem): "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий".  В меню "Вывод" определены три пункта меню (JCheckBoxMenuItem): "Квадрат",  "Круг",  и "Треугольник". В панели (JPanel) окна выводятся в графическом контексте (с помощью методов drawRect(), drawOval() и drawPolygon()) три фигуры: прямоугольник, круг и треугольник.

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

Вариант 4-08

Вывод фигур в графическом окне. В окне определена строка меню  (JMenuBar), в которой определены два меню (JMenu)  – "Цвет и "Вывод". В меню "Цвет" определены четыре пункта меню (JRadioButtonMenuItem): "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий".  В меню "Вывод" определены три пункта меню (JCheckBoxMenuItem): "Квадрат",  "Круг",  и "Треугольник". В верней панели окна панели (JPanel) окна выводятся в графическом контексте (с помощью методов drawRect(), drawOval() и drawPolygon()) три фигуры: прямоугольник, круг и треугольник. В нижней панели (JPanel) "Управление выводом" задается надпись (JLabel) "Цвет:", раскрывающееся меню  (JComboBox), в котором определены четыре пункта: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", надпись (JLabel) "Вывод:" и три переключателя (JCheckBox): "Квадрат",  "Круг",  и "Треугольник".

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

Вариант 4-09

Изменение размера изображения в графическом окне. В верхней панели окна (JPanel) окна "Вывод изображения" в компоненте (JLabel) задается произвольное изображение. В нижней панели (JPanel) "Управление выводом" задаются две кнопки  (JButton): "Увеличить" и "Уменьшить".

При нажатии первой кнопки изображение увеличивается на 10 пикселей по ширине и высоте, при нажатии второй кнопки – уменьшается на то же количество пикселей.

Вариант 4-10

Изменение размера изображения в графическом окне. В панели окна (JPanel) окна "Вывод изображения" в компоненте (JLabel) задается произвольное изображение. В панели инструментов  окна задаются две кнопки  (JButton): "Увеличить" и "Уменьшить".

При нажатии первой кнопки изображение увеличивается на 10 пикселей по ширине и высоте, при нажатии второй кнопки – уменьшается на то же количество пикселей.

Вариант 4-11

Перемещение фигуры в графическом окне. В центре верхней панели (JPanel) "Вывод изображения" в графическом контексте задается (с помощью метода drawRect()) прямоугольник.  В нижней панели (JPanel) "Перемещение изображения" задаются следующие компоненты: надпись (JLabel) "Цвет:", раскрывающееся меню  (JComboBox), в котором определены четыре пункта: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", а также четыре кнопки (JButton): "Влево", "Вверх" "Вправо" и "Вниз".  

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

Вариант 4-12

Перемещение фигуры в графическом окне. В центре верхней панели (JPanel) "Вывод изображения" в графическом контексте задается (с помощью метода drawRect()) прямоугольник.  В нижней панели (JPanel) "Перемещение изображения" задаются следующие компоненты: надпись (JLabel) "Цвет:", вращающийся список  (JSpinner) со значениями "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", а также четыре переключателя (JRadioButton): "Влево", "Вверх" "Вправо" и "Вниз" и кнопка (JButton) "Переместить".  

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

Вариант 4-13

Ввод текста в графическое окно приложения. В верхней панели (JPanel) окна "Характеристики шрифта" определены следующие компоненты: надпись (JLabel) "Цвет:", раскрывающееся меню  (JComboBox), в котором четыре пункта: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий",  надпись (JLabel) "Размер:" и три радиокнопки (JRadioButton)  с надписями: "12pt" (размер по умолчанию),  "14pt" и "16pt". В нижней текстовой панели (JTextPane) "Ввод текста" окна приложения вводится текст, набираемый на клавиатуре.

При выборе одного из пунктов меню текст в панели выводится соответствующим цветом и/или соответствующего размера.

Вариант 4-14

Ввод текста в графическое окно приложения. В панели инструментов окна (JToolBar) определены следующие компоненты (JButton) с надписями: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий",  "12pt" (размер по умолчанию),  "14pt" и "16pt". В текстовой панели (JTextPane) "Ввод текста" окна приложения вводится текст, набираемый на клавиатуре. Надписи в кнопках должны быть выполнены соответствующим цветом и шрифтом.

При выборе на панели инструментов цвета и/или размера текст в панели выводится соответствующим цветом и/или соответствующего размера.

Вариант 4-15

Изменение фигуры в графическом окне. В центре верхней панели (JPanel) "Вывод прямоугольника" в графическом контексте рисуется (с помощью метода drawRoundRect()) прямоугольник со скругленными вершинами.  В нижней панели (JPanel) "Параметры прямоугольника" задаются следующие компоненты: надпись (JLabel)   "Цвет:", вращающийся список (JSpinner) со значениями: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", надпись (JLabel)   "Ширина закругления", текстовое поле   (JTextField), надпись (JLabel)   "Высота закругления:", текстовое поле   (JTextField) и кнопка (JButton) "Изменить прямоугольник".

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

Вариант 4-16

Изменение фигуры в графическом окне. В центре верхней панели (JPanel) "Вывод прямоугольника" в графическом контексте рисуется (с помощью метода drawRoundRect()) прямоугольник со скругленными вершинами.  В нижней панели (JPanel) "Параметры прямоугольника" задаются следующие компоненты: надпись (JLabel)   "Цвет:", раскрывающее меню (JComboBox) со значениями: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", надпись (JLabel)   "Ширина закругления", вращающийся список (JSpinner), надпись (JLabel)   "Высота закругления:", вращающийся список (JSpinner) и кнопка (JButton) "Изменить прямоугольник".

При наборе данных во вращающихся списках, вводе данных в текстовых полях (в пикселях) и при нажатии кнопки "Изменить прямоугольник" прямоугольник перерисовывается заданным цветом и с заданным новыми значениями ширины и высоты закруглений. Диапазон изменения вращающихся списков – от 0 до 30 с шагом 1.

Вариант 4-17

Рисование фигуры в графическом окне. В верхней панели (JPanel) "Вывод дуги" в графическом контексте рисуется (с помощью метода drawArc()) дуга. В нижней панели (JPanel) "Параметры дуги" задаются следующие компоненты: надпись (JLabel)   "Координата X:", текстовое поле   (JTextField), надпись (JLabel)   "Координата Y:", текстовое поле   (JTextField),  надпись (JLabel)   "Ширина:", текстовое поле   (JTextField), надпись (JLabel)   "Высота:", текстовое поле (JTextField), надпись (JLabel)   "Начальный угол:", текстовое поле   (JTextField), надпись (JLabel)   "Конечный угол:", текстовое поле   (JTextField) и кнопка (JButton) "Вывести дугу".

При вводе данных (в пикселях и в градусах – для углов) и при нажатии кнопки "Вывести дугу" дуга перерисовывается с заданными параметрами. При вводе данных проверяется, все ли данные введены и являются ли данные целыми числами. Значения углов должны являться положительными или отрицательными целыми числами в диапазоне (по абсолютной величине) от 0 до 360.

Вариант 4-18

Рисование фигуры в графическом окне. В верхней панели (JPanel) "Вывод дуги" в графическом контексте рисуется (с помощью метода drawArc()) дуга. В нижней панели (JPanel) "Параметры дуги" задаются следующие компоненты: надпись (JLabel)   "Координата X:", текстовое поле   (JTextField), надпись (JLabel)   "Координата Y:", текстовое поле   (JTextField),  надпись (JLabel)   "Ширина:", текстовое поле   (JTextField), надпись (JLabel)   "Высота:", текстовое поле (JTextField), надпись (JLabel)   "Начальный угол:", две радиокнопки  "Плюс" и "Минус", вращающийся список  (JSpinner), надпись (JLabel)   "Конечный угол:", две радиокнопки  "Плюс" и "Минус", вращающийся список  (JSpinner) и кнопка (JButton) "Вывести дугу".

При вводе данных для координат и размера (в пикселях), набора данных для углов и при нажатии кнопки "Вывести дугу" дуга перерисовывается с заданными параметрами. При вводе данных проверяется, все ли данные введены и являются ли данные целыми числами. Значения данных во вращающемся списке – в диапазоне от 0 до 360 с шагом 45.

Вариант 4-19

Изменение фигуры в графическом окне. В центре верхней панели (JPanel) "Вывод треугольника" в графическом контексте рисуется (с помощью метода drawPolygon()) треугольник.  В нижней панели (JPanel) "Параметры треугольника" задаются следующие компоненты: надпись (JLabel)   "Цвет:", раскрывающееся меню (JComboBox) с пунктами: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", надпись (JLabel)   "Номер вершины:", раскрывающееся меню  (JComboBox) с пунктами "1", "2" и "3",  надпись (JLabel)   "Координата X:", вращающийся список  (JSpinner), надпись (JLabel)   "Координата Y:", вращающийся список  (JSpinner) и кнопка (JButton) "Изменить треугольник".

При наборе данных во вращающихся списках (в пикселях) и при нажатии кнопки "Изменить треугольник" треугольник перерисовывается заданным цветом и с заданным новым положением одной из вершин. Диапазон изменения вращающихся списков – от 0 до 150 с шагом 1.

Вариант 4-20

Изменение фигуры в графическом окне. В центре верхней панели (JPanel) "Вывод треугольника" в графическом контексте рисуется (с помощью метода drawPolygon()) треугольник.  В нижней панели (JPanel) "Параметры треугольника" задаются следующие компоненты: надпись (JLabel)   "Цвет:", вращающийся список (JSpinner) со значениями: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", надпись (JLabel)   "Номер вершины:", вращающийся список (JSpinner) со значениями "1", "2" и "3",  надпись (JLabel)   "Координата X:", текстовое поле   (JTextField), надпись (JLabel)   "Координата Y:", текстовое поле   (JTextField) и кнопка (JButton) "Изменить треугольник".

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

Вариант 4-21

Изменение надписи в графическом окне.  В центре верхней панели (JPanel) "Вывод надписи" в графическом контексте выводится (с помощью метода drawString()) произвольная надпись. В нижней панели (JPanel) "Параметры надписи" задаются следующие компоненты: надпись (JLabel) "Текст:", текстовое поле   (JTextField), надпись (JLabel)   "Цвет:", вращающийся список (JSpinner) со значениями: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", надпись (JLabel) "Размер:", вращающийся список (JSpinner)  со значениями "10pt",  "12pt" (размер по умолчанию), "14pt" и "16pt", надпись (JLabel) "Координата X:", текстовое поле   (JTextField),  надпись (JLabel) "Координата Y:", текстовое поле   (JTextField), а также кнопка (JButton) "Вывести строку".

Первоначально в текстовых полях "Координата X:" и "Координата Y:" устанавливаются координаты начала базовой линии надписи (текстовые поля заданы как нередактируемые). При вводе данных надпись меняет текст, цвет и/или размер. При щелчке мышью в области верхней панели в текстовых полях выводятся координаты точки щелчка, и надпись перерисовывается в этой точке.

Вариант 4-22

Изменение надписи в графическом окне.  В центре верхней панели (JPanel) "Вывод надписи" в графическом контексте выводится (с помощью метода drawString()) произвольная надпись. В нижней панели (JPanel) "Параметры надписи" задаются следующие компоненты: надпись (JLabel) "Текст:", текстовое поле   (JTextField), надпись (JLabel)   "Цвет:", четыре радиокнопки (JRadioButton) со значениями: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", вращающийся список (JLabel) "Размер:", три радиокнопки (JRadioButton) со значениями: "10pt",  "12pt" (размер по умолчанию) и "14pt", надпись (JLabel) "Координата X:", текстовое поле   (JTextField),  надпись (JLabel) "Координата Y:", текстовое поле   (JTextField),  а также кнопка (JButton) "Вывести строку".

Первоначально в текстовых полях "Координата X:" и "Координата Y:" устанавливаются координаты начала базовой линии надписи (текстовые поля заданы как нередактируемые). При вводе данных надпись меняет текст, цвет и/или размер. При щелчке мышью в области верхней панели в текстовых полях выводятся координаты точки щелчка и надпись перерисовывается в этой точке.

Вариант 4-23

Рисование фигуры в графическом окне. В центре верхней панели (JPanel) "Вывод эллипса" в графическом контексте рисуется (с помощью метода drawOval()) эллипс.  В нижней панели (JPanel) "Параметры эллипса" задаются следующие компоненты: надпись (JLabel)   "Цвет:", четыре радиокнопки (JRadioButton) с надписями: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", надпись (JLabel)   "Координата X центра:", текстовое поле  (JTextField),  надпись (JLabel)   "Координата Y центра:", текстовое поле  (JTextField), надпись (JLabel)   "Полуось a:", текстовое поле  (JTextField), надпись (JLabel)   "Полуось b:", текстовое поле  (JTextField) и кнопка (JButton) "Вывести эллипс".

При вводе данных в текстовых полях (в пикселях) и при нажатии кнопки "Вывести эллипс" в верхней панели рисуется эллипс. Перед выводом фигуры выполняется проверка, введены ли все данные и являются ли они числами. Для вызова метода drawOval() выполняются следующие преобразования:  координата X левого верхнего угла вычисляется как координата X центра минус значение a, координата Y левого верхнего угла вычисляется как координата Y центра минус значение b, ширина – как удвоенное значение a, а высота – как удвоенное значение b.

Вариант 4-24

Рисование фигуры в графическом окне. В центре верхней панели (JPanel) "Вывод эллипса" в графическом контексте рисуется (с помощью метода drawOval()) эллипс.  В нижней панели (JPanel) "Параметры эллипса" задаются следующие компоненты: надпись (JLabel)   "Цвет:", раскрывающееся меню (JComboBox) с пунктами: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", надпись (JLabel)   "Координата X центра:", вращающийся список  (JSpinner),  надпись (JLabel)   "Координата Y центра:", вращающийся список  (JSpinner), надпись (JLabel)   "Полуось a:", вращающийся список  (JSpinner), надпись (JLabel)   "Полуось b:", вращающийся список  (JSpinner) и кнопка (JButton) "Вывести эллипс".

При наборе данных во вращающихся списках (в пикселях) и при нажатии кнопки "Вывести эллипс" в верхней панели рисуется эллипс. Диапазон изменения вращающихся списков – от 10 до 150 с шагом 1. Для вызова метода drawOval() выполняются следующие преобразования:  координата X левого верхнего угла вычисляется как координата X центра минус значение a, координата Y левого верхнего угла вычисляется как координата Y центра минус значение b, ширина – как удвоенное значение a, а высота – как удвоенное значение b.

Вариант 4-25

Ввод текста в графическое окно приложения. В верхней панели окна  (JPanel) "Параметры шрифта" заданы следующие компоненты:  надпись (JLabel)   "Цвет:", четыре радиокнопки (JRadioButton) с надписями: "Черный" (цвет по умолчанию),  "Красный", "Зеленый" и "Синий", надпись (JLabel)   "Размер:" и текстовое поле  (JTextField) (начальное значение этого текстового поля равно 12). В текстовой панели (JTextPane) "Ввод текста" окна приложения вводится текст, набираемый на клавиатуре. Надписи для радиокнопок должны быть выполнены соответствующим цветом.

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

Вариант 4-26

Ввод текста в графическое окно приложения. В верхней панели окна  (JPanel) "Параметры шрифта" заданы следующие компоненты:  надпись (JLabel)   "Стиль:", раскрывающееся меню  (JComboBox) с пунктами: "Простой" (стиль по умолчанию),  "Жирный" и "Курсив", надпись (JLabel)   "Размер:" и раскрывающееся меню  (JComboBox) с пунктами: "10pt" (стиль по умолчанию),  "12pt" (размер по умолчанию) и "14pt". В текстовой панели (JTextPane) "Ввод текста" окна приложения вводится текст, набираемый на клавиатуре.

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

Вариант 4-27

Рисование фигуры в графическом окне. В верхней панели окна  (JPanel) "Координаты вершин треугольника" заданы следующие компоненты:  надпись (JLabel)   "X1:", текстовое поле  (JTextField), надпись (JLabel)   "Y1:", текстовое поле  (JTextField), надпись (JLabel)   "X2:", текстовое поле  (JTextField), надпись (JLabel)   "Y2:", текстовое поле  (JTextField), надпись (JLabel)   "X3:", текстовое поле  (JTextField), надпись (JLabel)   "Y3:", текстовое поле  (JTextField) и кнопка (JButton) "Вывести треугольник". В нижней панели окна  (JPanel) "Вывод треугольника" в графическом контексте рисуется (с помощью метода fillPolygon()) треугольник, заполненный черным цветом.

Рисование треугольника выполняется после введения координат вершин при нажатии кнопки "Вывести треугольник". Перед выводом треугольника проверяется задание всех координат, которые должны быть положительными целыми числами.  

Вариант 4-28

Рисование фигуры в графическом окне. В верхней панели окна  (JPanel) "Координаты вершин треугольника" заданы следующие компоненты:  надпись (JLabel)   "X1:", вращающийся список  (JSpinner), надпись (JLabel)   "Y1:", вращающийся список  (JSpinner), надпись (JLabel)   "X2:", вращающийся список  (JSpinner), надпись (JLabel)   "Y2:", вращающийся список  (JSpinner), надпись (JLabel)   "X3:", вращающийся список  (JSpinner), надпись (JLabel)   "Y3:", вращающийся список  (JSpinner) и кнопка (JButton) "Вывести треугольник". В нижней панели окна  (JPanel) "Вывод треугольника" в графическом контексте рисуется (с помощью метода fillPolygon()) треугольник, заполненный черным цветом.

Рисование треугольника выполняется после введения координат вершин при нажатии кнопки "Вывести треугольник". Координаты вершин должны быть в диапазоне от 0 до 100.

Вариант 4-29

Изменение размера изображения в графическом окне. В верхней панели окна  (JPanel) "Размер изображения"  заданы следующие компоненты: надпись (JLabel)   "Ширина:", текстовое поле  (JTextField), надпись (JLabel)   "Высота:", текстовое поле  (JTextField) и кнопка  (JButton): "Вывести изображение". В нижней панели окна (JPanel) окна "Вывод изображения" в компоненте (JLabel) задается произвольное изображение.

При вводе размера изображения по ширине и высоте и нажатии кнопки "Вывести изображение" в нижней панели выводится масштабированное изображение с заданными размерами (в пикселях). Первоначально изображение имеет «естественный» размер. Перед выводом изображения выполняется проверка, заданы ли значения ширины и высоты и являются ли они целыми числами.

Вариант 4-30

Изменение размера изображения в графическом окне. В верхней панели окна  (JPanel) "Размер изображения"  заданы следующие компоненты: надпись (JLabel)   "Ширина:", бегунок  (JSlider), надпись (JLabel)   "Высота:", бегунок  (JSlider) и кнопка  (JButton): "Вывести изображение". В нижней панели окна (JPanel) окна "Вывод изображения" в компоненте (JLabel) задается произвольное изображение.

При установке бегунков размера изображения по ширине и высоте и нажатии кнопки "Вывести изображение" в нижней панели выводится масштабированное изображение с заданными размерами (в пикселях). Первоначально изображение имеет «естественный» размер. Нижние и верхние границы бегунков должны иметь значения 10 и 150.  

5. Содержание отчета

В отчете должен быть представлен текст программы (без сгенерированного кода), а также один или несколько скриншотов, отражающих выполнение программы.       

6. Вопросы для самоконтроля

  1.  На какие типы можно разделить компоненты Swing? Коротко охарактеризуйте каждый тип.
  2.  Какие части содержит схема MVC и как они взаимодействуют между собой? Коротко охарактеризуйте каждую часть.
  3.  Какие интерфейсы реализуют схему MVC в библиотеке Swing?
  4.  Как реализуется схема MVC в библиотеке Swing?
  5.  Какие компоненты корневой панели определены в Swing? Как можно получить или установить корневую панель?
  6.  Как реализована слоистая панель в Swing (создание, переменные и методы?
  7.  Какие компоненты можно задавать в панели содержимого? Как установить и получить панель содержимого? Как добавляются компоненты в панель содержимого?
  8.  Для каких целей используется и как реализуется стеклянная панель в Swing?
  9.  Как создается и закрывается фрейм в Swing?
  10.  Какими способами можно создавать диалоговые окна в Swing? Коротко охарактеризуйте каждый способ.
  11.  Как создаются диалоговые окна с помощью класса JDialog?
  12.  Какие стандартные диалоговые окна определены в классе JOptionPane в Swing? Как выполняется создание этих диалоговых окон?
  13.  Как создается внутренний фрейм и рабочий стол в Swing? Как производится обработка событий во внутреннем фрейме?
  14.  Как в Swing задается класс JPanel и как выполняется работа с этим классом в программах на языке Java?
  15.  Как в Swing реализуется вывод компонента на дисплей с помощью классов JScrollPane и JViewport?
  16.  Как в Swing реализована панель с вкладками (tabbed pane)?
  17.  Какие шаги необходимо выполнить в программе для реализации панели с вкладками?
  18.  Как в Swing реализована расщепленная панель (split pane)?
  19.  Как в Swing реализована панель инструментов (tool bar)?
  20.  Как в Swing реализованы значки (icons) и значки с изображением (image icons)?
  21.  Как в Swing реализованы надписи (labels)?
  22.  Какие операции над кнопками можно выполнять с помощью методов класса AbstractButton?
  23.  Как в Swing реализованы кнопки (buttons)?
  24.  Как в Swing реализованы флажки (check boxes)?
  25.  Как в Swing реализованы переключатели (radiobuttons)?
  26.  Какие виды списков определены в Swing? Коротко охарактеризуйте каждый вид списков.
  27.  Как в Swing реализовано комбинированное поле (combo box)?
  28.  Как в Swing реализован список (list)?
  29.  Как в Swing реализован «вращающийся» список (spinner)?
  30.  Как выполняется вывод и обработка событий для списков в классе Spinner?
  31.  Как выполняется вывод и обработка событий для чисел в классе Spinner?
  32.  Как выполняется вывод и обработка событий для дат в классе Spinner?
  33.  Какие возможности по обработке текста предоставляет класс JTextComponent?
  34.  Для каких целей используется, и какие типы текстового содержания позволяет обрабатывать класс JTextPane?
  35.  Как задается «всплывающее» меню в Swing?
  36.  Как реализуется индикатор выполнения (progress bar) в Swing?
  37.  Как реализуется полоса прокрутки (scroll bar) и бегунки (sliders) в Swing?
  38.  Как в Swing реализуются «всплывающие» подсказки?
  39.  Какие компоненты меню определены в языке Java, и какие классы реализуют эти компоненты? Дайте краткую характеристику каждого класса.
  40.  Как создается строка меню и как добавляются меню в строку меню в программе на языке Java?
  41.  Как добавляются пункты меню и подменю в меню
  42.  Как добавить разделители и «горячие» клавиши в пункты меню
  43.  Как добавляются пункты меню с флажком в  программе на языке Java?
  44.  Как обрабатываются события, связанные с выбором меню и пунктов меню в  программе на языке Java?
  45.  Какие типы рамок реализуются с помощью методов класса BorderFactory в Swing?
  46.  Как в Swing можно создать собственную рамку?
  47.  Для каких целей используются менеджеры компоновки в языке Java и как они реализуются?
  48.  Какие основные менеджеры компоновки реализованы в Java? Дайте краткую характеристику каждого менеджера компоновки.
  49.  Как в программе на языке Java задается используемый менеджер компоновки? Как задаются промежутки между границей контейнера и содержащихся в нем компонент?
  50.  Как выполняет абсолютное позиционирование компонент в графическом приложении или апплете Java?
  51.  Какова стратегия компоновки в менеджере FlowLayout? Как задается менеджер FlowLayout, и какие методы определены для класса FlowLayout?
  52.  Какова стратегия компоновки в менеджере GridLayout? Как задается менеджер GridLayout, и какие методы определены для класса GridLayout?
  53.  Какова стратегия компоновки в менеджере BorderLayout? Как задается менеджер BorderLayout, и какие методы определены для класса BorderLayout?
  54.  Какова стратегия компоновки менеджера BoxLayout и как она реализована в Swing?
  55.  Какова стратегия компоновки менеджера SpringLayout и как она реализована в Swing?
  56.  Как задаются ограничители в менеджере компоновки SpringLayout?
  57.  Какова стратегия компоновки менеджера GroupLayout и как она реализована в Swing?
  58.  Как работает модель делегирования событий в языке Java 2?
  59.  Как организована иерархия классов событий в языке Java?
  60.  Какие типы событий определены в языке Java? Дайте краткую характеристику каждого типа события.
  61.  Какие переменные и методы определены для класса ComponentEvent и интерфейса ComponentListener в языке Java?
  62.  Какие переменные и методы определены для класса ContainerEvent и интерфейса ContainerListener в языке Java?
  63.  Какие переменные и методы определены для класса FocusEvent и интерфейса FocusListener в языке Java?
  64.  Какие переменные и методы определены для классов и интерфейсов, связанных с обработкой окна в языке Java?
  65.  Какие переменные и методы определены для класса обработки событий ввода InputEvent в языке Java?
  66.  Какие переменные и методы определены для класса MouseEvent и интерфейсов, связанных с обработкой событий мыши в языке Java?
  67.  Какие переменные и методы определены для класса MouseWheelEvent и интерфейса MouseWheelListener в языке Java?
  68.  Какие шаги необходимо выполнить в программе на языке Java для реализации обработки события?

айл: file:///web/5fan/public_html/www/files/3/5fan_ru_18084_9b02bc35ce65da408e1b1783a666770a.doc   Создан: Модифицирован:     Автор:


 

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

29220. Судебная экспертиза 25.5 KB
  Предметом судебной экспертизы являются фактические данные устанавливаемые при расследовании или судебном разбирательстве по уголовным делам. В процессе проведения судебной экспертизы решаются три основные группы задач: 1 идентификация объектов людей предметов животных и т. К объектам судебной экспертизы относятся: вещественные доказательства отображения людей предметов материалы изделия трупы и др. Выводы которые при проведении комплексной экспертизы делаются каждым экспертом самостоятельно без участия других специалистов...
29221. План расследования по форме 29.5 KB
  Устным мысленным планом следователь ограничивается главным образом в начале расследования когда выполняет неотложные следственные действия на месте происшествия и у него пока нет возможности составить письменный план. В этот момент он также не может обойтись без планирования расследования и должен с самого начала действовать по определенному пусть мысленному но всесторонне продуманному плану иначе его работа по делу сразу же приобретает хаотический характер и как правило малоэффективна. Выполнив все неотложные мероприятия следователь...
29222. Два кольцевых развозочных и маятниковый маршрута для перевозки грузов 597 KB
  Составить два кольцевых развозочных и маятниковый маршрута для перевозки грузов. Рассчитать маршруты и технико-эксплуатационные показатели работы подвижного состава на маршрутах, определить себестоимость перевозок и плату за перевозку грузов. Заполнить образцы договора, путевого листа и товарно-транспортной накладной на перевозку одного вида груза.
29223. Построение версий в криминальном праве 31 KB
  Существуют следующие логические приемы при построении версий такие как анализ и синтез индукция дедукция и аналогия. Логические приемы индукции и дедукции при формировании версий могут быть тесно взаимосвязаны. Если дедуктивное умозаключение применяется главным образом при построении частных версий для объяснения единичных фактов и отдельных признаков то индуктивное умозаключение применяется в случаях когда приходится обобщать некоторую совокупность фактов.
29225. Тактика допроса свидетелей и потерпевших 35.5 KB
  Во вторых необходимо что бы показания свидетелей были сущей правдой. Или свидетель намерен сказать правду но е говорит ее потому что не правильно понял то что он знает или же свидетель имеет прямое намерение дать заведомо ложные показания. Подобное вмешательство может сбить допрашиваемого порядок может быть нарушен может запутаться в показаниях и упустить важные детали. После окончания свободного рассказа следователь путем постановки вопросов восполняет и уточняет показания.
29226. Основные цели проверки показания на месте, понятие, тактический приемы и процессуальный порядок 24 KB
  В целях установления новых обстоятельств имеющих значение для уголовного дела показания ранее данные подозреваемым или обвиняемым а также потерпевшим или свидетелем могут быть проверены или уточнены на месте связанном с исследуемым событием. Проверка показаний на месте заключается в том что ранее допрошенное лицо воспроизводит на месте обстановку и обстоятельства исследуемого события указывает на предметы документы следы имеющие значение для уголовного дела демонстрирует определенные действия. Не допускается одновременная проверка...
29227. Социальные институты культуры 39 KB
  Традиционно семья определяется как основанное на браке и кровном родстве объединение людей связанное общностью быта и взаимной ответственностью. Но семья как правило представляет более сложную систему отношений чем брак поскольку она может объединять не только супругов но и их детей а также других родственников. Семья как социальный институт в различных культурах принимает различные формы. В зависимости от формы брака выделяются моногамная и полигамная семья.
29228. Искусство как феномен культуры 36.5 KB
  Особым видом социальной практики является собственно художественное творчество в процессе функционирования которого создаются произведения искусства имеющие общественно значимый смысл и отличающиеся оригинальностью и новизной. Это третий и самый узкий смысл в понимании искусства. Специфика искусства заключается в том что искусство осваивает и выражает действительность в художественнообразной форме. Художественный образ это суть искусства это чувственное воссоздание жизни сделанное с субъективных авторских позиций.