Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
63
Добавлен:
24.02.2016
Размер:
282.62 Кб
Скачать

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);

}

}