- •Лабораторная работа 2
- •Цели работы
- •Порядок выполнения работы
- •Вопросы для самопроверки и защиты.
- •Краткие теоретические сведения
- •Рисование в окне
- •Графика
- •Приложение FontsList
- •Как обрабатываются события в Java 1.1
- •Приложение LinesDraw
- •Int xDown, yDown; // координаты нажатия клавиши
- •Int xPrev, yPrev; // предыдущие координаты конца линии
- •Приложение KeyCodes
- •Графика 2d
Int xDown, yDown; // координаты нажатия клавиши
Int xPrev, yPrev; // предыдущие координаты конца линии
Vector lines; // массив координат линий
public void init()
{
lines = new Vector();
MouseListener ml = new MouseAdapter(){
public void mousePressed(MouseEvent e) {
xPrev = e.getX();
yPrev = e.getY();
}
public void mouseReleased(MouseEvent e) {
xDown = e.getX();
yDown = e.getY();
int k = e.getClickCount();
System.out.println(k);
if ( k < 2)
{ Rectangle p=new Rectangle(xPrev,yPrev,xDown-xPrev,yDown-yPrev);
lines.addElement(p);
}
else
lines.removeAllElements();
repaint();
addMouseListener(ml);
}
public void paint(Graphics g)
{
Dimension appSize = getSize();
g.setColor(Color.yellow);
g.fillRect(0,0,appSize.width, appSize.height);
g.setColor(Color.black);
int size = lines.size();
for ( int i = 0; i < size; i++ )
{
Rectangle p=(Rectangle)lines.elementAt(i);
g.drawLine(p.x, p.y, p.x+p.width, p.y+p.height);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame ("Пример");
int width = 800;
int height = 300;
DrawLines appl = new DrawLines();
appl.init();
appl.start();
frame.getContentPane().add(appl);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width,height);
frame.setVisible(true);
}
}
А теперь попробуем выполнить обработку событий при движении мыши. Просто добавим в метод init код:
MouseMotionListener mm = new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent e)
{
xDown = e.getX();
yDown = e.getY();
Rectangle p=new Rectangle(xPrev,yPrev,xDown-xPrev,yDown-yPrev);
lines.addElement(p);
xPrev = xDown;
yPrev = yDown;
repaint();
}
};
addMouseMotionListener(mm);
Мы просто ловим события при движении мыши с нажатой кнопкой и обрабатываем его в методе mouseDragged(MouseEvent e).
Приложение KeyCodes
Создадим апплет двойного назначения KeyCodes, в окне которого отображаются символы, соответствующие нажимаемым клавишам, код соответствующей клавиши и коды модификации. В процессе отображения новые строки должны появляться в верхней части окна, а старые сдвигаться вниз после отпускания клавиши (должна быть организована свертка в окне).
В этом приложении мы научимся обрабатывать события от клавматуры.
Объявление элементов класса апплета.
В классе апплета объявим следующие элементы:
int yHeight; // высота символов шрифта, выбранного по умолчанию
Dimension appSize; // текущий размер окна апплета
Инициализация апплета (метод init()).
При инициализации апплета в методе init()получим высоту символов шрифта для вывода текста в окно.
Перерисовка окна апплета (метод paint()).
Для перерисовки изображения в окне используется метод paint(), которому передается объектgтипаGraphics(g - контекст отображения для окна). Методами этого класса пользуются для вывода графической информации в окно апплета.
В данном апплете этот метод используется для определения текущего размера appSizeокна и для закраски фона окна и рисовании рамки окна.
Обработка нажатия клавиши (метод keyPressed()).
Для обработки событий от клавиш используется KeyListener. Мы создаем объект анонимного внутреннего класса на основеKeyAdapterи организуем обработку методовKeyPressedиKeyReleased.
В методе KeyPressedбудем выводить строку информации о нажатой клавише в верхней части окна. Сначала сформируем объект s класса String, равный
"Char - " + e.getKeyChar() + ", Key - " + e.getKeyCode() + ", Modifiers - " + e.getModifiers();
Для того, чтобы получить информацию о контексте окна апплета вне метода paint(), необходимо получить контекст отображения (методу paint() этот контекст передается через параметр). Получим этот контекст g классаGraphics методом апплетаgetGraphics()
Затем получим объект fmклассаFontMetrics, который содержит метрики текущего шрифта, методомg.getFontMetrics.
Сохраним высоту символов, выдаваемую методом fm.getHeight(),в переменнойyHeight. Эта величина нужна для определения шага свертки.
Теперь выведем в окно строку sв точке с координатами (10,yHeight) методомg.drawString().
Обработка отпускания клавиши (метод keyReleased()).
Получим методом getGraphics()контекст окнаgклассаGraphics и с помощью методаg.copyArea()скопируем часть экрана, ограниченную прямоугольником с началом в точке (0, 1), ширинойappSize.width-1и высотойappSize.height-yHeight-5, в область с началом в точке (0, yHeight+1).
Затем методом g.setColor()выберем цвет фонаColor.yellowи методомg.fillRect() закрасим область вывода очередной строки - прямоугольник с началом в точке (1, 1), ширинойappSize.width-2и высотойyHeight+1.
В этом примере отрисовка выполняется не в методе paint. Попробуйте понажимать клавиши побыстрее, посмотрите, что получается, продумайте, как исправить приложение.
Пример 3. Приложение KeyCodes.
import javax.swing.*;
import java.util.Vector;
import java.awt.event.*;
import java.awt.*;
public class KeyCodes extends JApplet{
int yHeight; // высота символов шрифта, выбранного по умолчанию
Dimension appSize; // текущий размер окна апплета
public void init()
{
KeyListener mm = new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
Graphics g = getGraphics();
FontMetrics fm = g.getFontMetrics();
yHeight = fm.getHeight();
String s = "Char - " + e.getKeyChar() + ", Key - " + e.getKeyCode() + ", Modifiers - " + e.getModifiers();
g.drawString(s, 10, yHeight);
}
public void keyReleased(KeyEvent e)
{
Graphics g = getGraphics();
g.copyArea(0,1,appSize.width-1,appSize.height-yHeight-5,0,yHeight+1);
g.setColor(Color.YELLOW);
g.fillRect(1,1,appSize.width-2,yHeight+1);
}
};
addKeyListener(mm);
}
public void paint(Graphics g)
{
appSize = getSize();
g.setColor(Color.YELLOW);
g.fillRect(1,1,appSize.width-1,appSize.height-1);
}
public static void main(String[] args) {
JFrame frame = new JFrame ("Пример");
int width = 800;
int height = 300;
KeyCodes appl = new KeyCodes();
appl.init();
frame.getContentPane().add(appl);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(width,height);
frame.setVisible(true);
}
}