Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Режим FlowLayout
Режим GridLayout
Режим BorderLayout
Режим CardLayout
GridBagLayout -  пример 1
GridBagLayout - заполнение формы
Инструментальная линейка
Панели
Точное размещение компонент
Прилипчивая кнопка

Назад

5.10. "Прилипчивая" кнопка

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

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java JDK 1.1)

Немного теории

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

Описание примера

Сразу после запуска аплета в центре его окна появляется кнопка с названием Yellow. Как только вы поднесете курсор мыши в к окну аплета, эта кнопка "прыгнет" на него и в дальнейшем будет следовать за курсором мыши, как привязанная. Нажав на кнопку, вы измените цвет фона окна на желтый, причем надпись на кнопке изменится на White (рис. 1).

pic1.gif (1344 bytes)

Рис. 1. Окно аплета с "прилипчивой" кнопкой

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

Рассмотрим исходный текст аплета.

Главный класс аплета ButtonGo

Главный класс нашего алпета создан на базе класса Applet:

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class ButtonGo extends Applet
  implements ActionListener, 
  MouseMotionListener, MouseListener
{
  . . .
}

Дополнительно он реализует три интерфейса - ActionListener (обработка событий от кнопки), MouseMotionListener (отслеживание перемещений курсора мыши) и MouseListener (отслеживание нажатий на кнопку мыши).

В классе ButtonGo мы определили несколько полей:

Button btn;
int btnX = 0;
int btnY = 0;
Dimension dm;
boolean bYellow = false;

Поле btn хранит ссылку на кнопку.

В полях btnX и btnY находятся текущие координаты курсора мыши.

Поле dm содержит размеры окна аплета.

Поле bYellow - флаг цвета фона. Если в этом поле хранится значение true, фон желтый, если false - белый.

Метод init

Прежде всего метод init создает кнопку:

btn = new Button("Yellow");

Далее он отключает систему Layout Manager и добавляет кнопку в окно методом add:

setLayout(null);
add(btn);

Для кнопки и мыши назначаются обработчики событий:

btn.addActionListener(this);
this.addMouseMotionListener(this);
this.addMouseListener(this);

На следующем шаге метод init определяет размеры окна аплета и устанавливает начальное расположение кнопки - в центре этого окна:

dm = getSize();
btnX = dm.width / 2;
btnY = dm.height / 2;
Метод paint

Метод paint очень прост. Он устанавливает новое расположение кнопки в соответствии с координатами, хранящимися в полях btnX и btnY:

public void paint(Graphics g)
{
  btn.setBounds(btnX, btnY, 70, 25);
}
Метод actionPerformed

Когда пользователь нажимает на кнопку, метод actionPerformed проверяет и инвертирует флаг bYellow:

public void actionPerformed(ActionEvent e)
{
  if(e.getSource().equals(btn))
  {
    if(!bYellow)      
    {
      setBackground(Color.yellow);
      bYellow = true;
      btn.setLabel("White");
    }
    else
    {
      setBackground(Color.white);
      bYellow = false;
      btn.setLabel("Yellow");
    }
  }
}

Если на момент проверки этот флаг был установлен, выбирается белый цвет фона, вслед за чем флаг сбрасывается, а если сброшен - устанавливается желтый цвет фонаю В поле bYellow при этом записывается значение true.

Метод mouseMoved

При перемещении курсора мыши метод mouseMoved устанавливает новое расположение для кнопки, а затем перерисовывает окно аплета:

public void mouseMoved(MouseEvent e)
{
  btnX = e.getX() - 30;
  btnY = e.getY() - 12;
    
  repaint();
}
Остальные методы

В исходном тексте определены и другие методы как часть соответствующих интерфейсов:

public void mouseDragged(MouseEvent e)
{
}

public void mousePressed(MouseEvent e)
{
}

public void mouseReleased(MouseEvent e)
{
}
  
public void mouseClicked(MouseEvent e)
{
}
  
public void mouseEntered(MouseEvent e)
{
}
  
public void mouseExited(MouseEvent e)
{
}

Однако эти методы не используются нашим приложением.


Назад

[Назад]