содержание   вперед   назад

14. Класс butImage -- слайд-проектор

Следующий достаточно интересный и общий класс butImage, показывает картинки в отдельном окне. При этом программа ждет, когда картинка будет снята с экрана и ничего не делает. Для удобства пользователя, снять картинку с экрана можно кликнув на ней в любом месте. При этом программа получает информацию о том, каким образом был сделан клик, просто левой кнопкой мыши или с одновременным нажатием клавиши. А также возвращает положение курсора в момент клика. В любой момент положение курсора и размер картинки показывается в нижней строке. Есть еще дополнительное свойство. Можно нажать кнопку мыши и не отпуская ее переместить мышь в другое место и затем отпустить. Тогда картинка исчезает, но программа возвращает как начальные координаты курсора, так и конечные координаты. Это свойство в данной программе не используется, но оно позволяет достаточно просто реализовать вырезание фрагмента из картинок.

Итак снова вызываем код класса по ссылке и начинаем смотреть. Прежде всего, класс является наследником нового для нас класса JDialog и поддерживает два интерфейса, которые следят за событиями от кнопок и от мыши. Конструктор класса содержит 4 аргумента. Первый -- это окно-родитель, диалог должен быть приклеен к этому окну. Он будет открываться и закрываться вместе с ним. Второй -- заголовок окна, третий -- сама картинка, четвертый -- логическая переменная, указывающая свойства диалога. Первой командой является вызов конструктора родителя нашего класса, то есть JDialog методом super. Таким образом мы сообщаем об окне-родителе диалога. Дальше устанавливаем заголовок и свойство не изменять размеры окна. Следующий метод setModal(ok) устанавливает свойство останавливать программу или не останавливать. Если ok=true, то программа будет ждать закрытия окна. А если ok=false, то она покажет окно и будет работать дальше. В нашей программе дальше ничего нет, но в других программах может быть много чего еще. Далее методами getIconWidth() и getIconHeight() определяются размеры картинки. После этого заказывается объект класса JButton. Это кнопка. Его конструктору передается наша картинка. Кнопке можно передавать как текст, так и картинку, есть разные конструкторы. Мы делаем нашу картинку кнопкой, так что ее можно будет кликать. Метод setMargin(new Insets(0,0,0,0)) позволяет поставить на кнопку поля вне объекта. Для тех, кто знает английский язык все понятно без слов. Тем же, кто не знает, я советую поставить на компьютер англо-русский словарь (в интернете есть много бесплатных словарей) и смотреть значение слов в словаре. У нас поля нулевые. Методы setActionCommand и addActionListener вам уже знакомы, а вот метод addMouseMotionListener раньше не встречался, но он также очевиден. Кнопка будет ловить действия мыши.

Далее мы вставляем кнопку в рамку из линеек прокрутки. После этого заказываем область редактирования -- объект уже знакомого класса JTextArea и устанавливаем для него свойство отказа от редактирования. Мы сами будем печатать текст в этой области. Наконец, передаем панель окна контейнеру и начинаем размещать объекты, используя по умолчанию режим BorderLayout. На севере ставим объект Box.createVerticalStrut(ifs) . Это пустая полоска во всю ширину панели и с вертикальным размером, равным числу ifs, в нашем случае 3. На западе ставим пустую полоску во всю высоту панели и с горизонтальным размером ifs. В центре ставим нашу картинку. На востоке опять пустую полоску, а на юге -- нашу область редактирования. Далее определяем размеры экрана и если размеры картинки меньше размеров экрана, то упаковываем окно, а если больше, то ставим размеры экрана. При этом автоматически появятся линейки прокрутки. Метод setLocationRelativeTo(null) устанавливает картинку в центре экрана. Остальное вам известно по программе First. Здесь в явном виде стоит 2 вместо длинного названия константы WindowConstants.DISPOSE_ON_CLOSE .

Итак, картинка показана. Осталось написать код реакции на действия пользователя. Это делается разными стандартными методами интерфейсов, следящих за событиями. Первый метод actionPerformed отслеживает событие клика кнопки. И если событие произошло, он возвращает в целую переменную mod номер нажатой одновременно с кликом клавиши. То есть модификатор. Одновременно в строку ps записывается полная информация о событии. Мы обсудим только модификатор. Для простого клика он равен 16, другие варианты: 17 для Shift+Click, 18 для Ctrl+Click, 19 для Shift+Ctrl+Click, 24 для Alt+Click, 25 для Alt+Shift+Click, 26 для Alt+Ctrl+Click, 27 для Alt+Ctrl+Shift+Click. Эти значения проще всего получить экспериментальным путем, то есть закрыть картинку разными способами и распечатать значение mod. В нашей программе это не делается, но вы можете сами попробовать изменить программу так, чтобы сделать это. Интересно, что значение mod никак не возвращается. Но обратите внимание, что переменная объявлена public static, то есть вы можете использовать ее в виде butImage.mod в любом другом классе. Методы mouseMoved и mouseDragged делают достаточно очевидную работу и я даже не буду их комментировать.

содержание   вперед   назад


.