Статьи

Использование декораторов в Pivot

Недавно я читал превосходную книгу « Отвратительные богатые клиенты » Чета Хааза и Ромена Гая. Я поднял его пару недель назад, чтобы посмотреть, как можно применить некоторые классные эффекты Java2D к приложению Pivot. Поскольку Pivot и Swing основаны на Java2D, я надеялся, что это не будет слишком сложно. Оказывается, это было довольно легко.

Например, книга содержит раздел о создании отражений. В Swing для этого требуется собственный менеджер перерисовок. В Pivot это можно сделать с помощью декоратора. Декораторы позволяют вызывающему приложить дополнительное поведение рендеринга для компонента Интерфейс декоратора определяется следующим образом:

public interface Decorator {
public Graphics2D prepare(Component component, Graphics2D graphics);
public void update();

public Rectangle getBounds(Component component);
public void repaint(Component component, int x, int y, int width, int height);
}

Метод prepare () вызывается непосредственно перед методом paint () компонента и позволяет вызывающей стороне изменять или заменять графический объект, на котором будет нарисован компонент. Например, класс DropShadowDecorator Pivot рисует полупрозрачный черный прямоугольник под компонентом для имитации тени. FadeDecorator устанавливает AlphaComposite на графике , прежде чем компонент называется, что делает весь компонент появляются полупрозрачные.

Метод update () вызывается сразу после рисования компонента. Это позволяет вызывающей стороне рисовать поверх компонента после завершения рисования самого компонента. Например, класс ShadeDecorator рисует полупрозрачный цветной прямоугольник по всему компоненту, а класс WatermarkDecorator рисует текстовую строку над компонентом, имитируя бумажный водяной знак.

Подготовить () и обновление () методы также могут быть использованы вместе , чтобы добиться интересных визуальных эффектов. BlurDecorator и GrayscaleDecorator делают «снимок» компонента, возвращая графический объект BufferedImage из prepare () , а затем рисуют буферизованное изображение в исходный графический объект в update () . ReflectionDecorator также работает подобным образом и использует технику, аналогичную описанной в книге, для рисования отражения неокрашенного окна, содержащего изображение JPEG.

К компоненту может быть прикреплено несколько декораторов, а декораторы «связаны». Методы prepare () декораторов вызываются в порядке убывания, передавая выходные данные каждого из них предшествующему декоратору. В обновление () методы вызываются в возрастающем порядке после того , как компонент окрашена. Это позволяет вызывающей стороне создать окно, содержимое которого отображается в черно-белом режиме, а также, например, рисует тень.

В дополнение к тому, что я попробовал некоторые примеры в Filthy Rich Clients, меня также вдохновило посмотреть, как можно реализовать эффект полупрозрачного окна, описанный в веб-журнале Джоша Мариначчи несколько недель назад. Экземпляр FadeDecorator, прикрепленный к окну Frame, сделал свое дело. Результат обоих экспериментов показан в апплете ниже:

Как и в демонстрации Джоша, при наведении курсора на рамку непрозрачность изменяется до 0,9, а при наведении мышки — до 0,5. К счастью, реализовать логику обработчика мыши в Pivot немного проще: просто прикрепите ComponentMouseListener к фрейму:

fadeFrame.getComponentMouseListeners().add(new ComponentMouseListener() {
public void mouseMove(Component component, int x, int y) {
// No-op
}

public void mouseOver(Component component) {
fadeDecorator.setOpacity(0.9f);
component.repaint();
}

public void mouseOut(Component component) {
fadeDecorator.setOpacity(0.5f);
component.repaint();
}
});

Версия Pivot также не требует каких-либо специфичных для ОС взломов — тот же код работает в OSX, Linux и Windows.

Полный исходный код для демонстрации можно найти здесь .

От http://weblogs.java.net/blog/gkbrown/