Читаем Java 7 полностью

private Color c = new Color(127, 127, 127); private Label lm = new Label();

private Button

b1 = new Button("Применить"), b2 = new Button("Отменить");

ScrollTest1(String s){ super(s);

setLayout(null);

setFont(new Font("Serif", Font.BOLD, 15));

Panel p = new Panel(); p.setLayout(null);

p.setBounds(10,50, 150, 260); add(p);

Label lc = new Label("Подберите цвет"); lc.setBounds(20, 0, 120, 30); p.add(lc);

Label lmin = new Label("0", Label.RIGHT); lmin.setBounds(0, 30, 30, 30); p.add(lmin);

Label lmiddle = new Label("127", Label.RIGHT); lmiddle.setBounds(0, 120, 30, 30); p.add(lmiddle); Label lmax = new Label("255", Label.RIGHT); lmax.setBounds(0, 200, 30, 30); p.add(lmax);

sbRed.setBackground(Color.red); sbRed.setBounds(40, 30, 20, 200); p.add(sbRed); sbRed.addAdjustmentListener(new ChColor());

sbGreen.setBackground(Color.green); sbGreen.setBounds(70, 30, 20, 200); p.add(sbGreen) sbGreen.addAdjustmentListener(new ChColor());

sbBlue.setBackground(Color.blue); sbBlue.setBounds(100, 30, 20, 200); p.add(sbBlue); sbBlue.addAdjustmentListener(new ChColor());

Label lp = new Label("Образец:"); lp.setBounds(250, 50, 120, 30); add(lp);

lm.setBackground(new Color(127, 127, 127)); lm.setBounds(220, 80, 120, 80); add(lm);

b1.setBounds(240, 200, 100, 30); add(b1); b1.addActionListener(new ApplyColor());

b2.setBounds(240, 240, 100, 30); add(b2); b2.addActionListener(new CancelColor());

setSize(400, 300); setVisible(true);

}

class ChColor implements AdjustmentListener{

e) {

= c.getBlue(); getValue(); getValue(); getValue();

public void adjustmentValueChanged(AdjustmentEvent int red = c.getRed(), green = c.getGreen(), blue if (e.getAdjustable() == sbRed) red = e

else if (e.getAdjustable() == sbGreen) green = e else if (e.getAdjustable() == sbBlue) blue = e c = new Color(red, green, blue); lm.setBackground(c);

}

class ApplyColor implements ActionListener{

public void actionPerformed(ActionEvent ae){ setBackground(c);

}

}

class CancelColor implements ActionListener{ public void actionPerformed(ActionEvent ae){ c = new Color(127, 127, 127); sbRed.setValue(127); sbGreen.setValue(127) ; sbBlue.setValue(127); lm.setBackground(c); setBackground(Color.white);

}

}

public static void main(String[] args){

Frame f = new ScrollTest1(" Выбор цвета"); f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent ev){ System.exit(0);

}

});

}

}

Несколько слушателей одного источника

В начале этой главы, в листингах 15.1—15.3, мы привели пример класса TextMove, слушающего сразу два компонента: поле ввода tf типа JTextField и кнопку b типа JButton.

Чаще встречается обратная ситуация — несколько слушателей следят за одним компонентом. В том же примере кнопка b в ответ на щелчок по ней кнопки мыши совершала еще и собственные действия — она "вдавливалась", а при отпускании кнопки мыши становилась "выпуклой". В классе Button эти действия осуществляет peer-объект.

В классе FlowerButton листинга 10.7 такие же действия выполняет метод paint ( ) этого класса.

В данной модели реализован design pattern под названием Observer.

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

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

Ссылки на присоединенные методами addXxxListener( ) слушатели можно было бы хранить в любом классе-коллекции, например Vector, но в пакет java.awt специально для этого введен класс AWTEventMulticaster. Он реализует все одиннадцать интерфейсов XxxListener, значит, сам является слушателем любого события. Основу класса составляют своеобразные статические методы add (), написанные для каждого типа событий, например:

add(ActionListener a, ActionListener b);

Своеобразие этих методов двоякое: они возвращают ссылку на тот же интерфейс, в данном случае ActionListener, и присоединяют объект a к объекту b, создавая совокупность слушателей одного и того же типа. Это позволяет использовать их наподобие операций a += b.

Заглянув в исходный текст класса Button, вы увидите, что метод addActionListener() очень прост:

public synchronized void addActionListener(ActionListener l){ if (l == null){ return; }

actionListener = AWTEventMulticaster.add(actionListener, l); newEventsOnly = true;

}

Он добавляет к совокупности слушателей actionListener нового слушателя l.

Для событий типа InputEvent, а именно KeyEvent и MouseEvent, есть возможность прекратить дальнейшую обработку события методом consume (). Если записать вызов этого метода в класс-слушатель, то ни peer-объекты, ни следующие слушатели не будут обрабатывать событие. Таким способом обычно пользуются, чтобы отменить стандартные действия компонента, например "вдавливание" кнопки.

Диспетчеризация событий

Перейти на страницу:

Все книги серии В подлиннике

Java 7
Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др. Дано подробное изложение последней версии сервлетов, технологии JSP и библиотек тегов JSTL. Около двухсот законченных программ иллюстрируют рассмотренные приемы программирования. Приведена подробная справочная информация о классах и методах Core Java API.

Ильдар Шаукатович Хабибуллин

Программирование, программы, базы данных

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных