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

Lab05_2010_draft3

.pdf
Скачиваний:
33
Добавлен:
07.06.2015
Размер:
2.53 Mб
Скачать

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

Рис. 81. Тело метода mousePressed

Рис. 82. Слушатель событий мыши добавлен

Вся работа по отрисовке swing-компонентов выполняется в методе paintComponent (для awt-компонентов – в методе paint). Каждый раз, когда изображение компонента необходимо обновить (когда он был перекрыт каким-то другим окном или приложение было свернуто), метод update обращается (в том числе) к методу paintComponent (оба эти метода определены в классе JComponent).

void preferImage(Graphics g){ g.setColor(backgroundColor); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(foregroundColor);

}

@Override

public void paintComponent(Graphics g){ super.paintComponent(g);

if (bufImage == null){ bufImage=(BufferedImage)createImage(getWidth(), getHeight()); preferImage(bufImage.getGraphics());

}

g.drawImage(bufImage, 0, 0, null);

}

Заливка bufImage вынесена в отдельный метод, чтобы при выполнении заданий (например, очистке экрана) не было необходимости писать этот фрагмент кода в другом методе.

Сам же bufImage становится «копией» изображения, которое пользователь будет рисовать на экране. Он создается при первом обращении к методу перерисовки компонента.

Сохраните Ваш проект и запустите его на выполнение. Попробуйте нарисовать чтонибудь на панели, сверните окно, перекройте его другими. Если все правильно сделано, рисунок больше не будет «исчезать».

Какие еще дополнения можно внести в редактор (по нарастанию сложности):

1.очистка поля для рисования (не забывайте очистить и объект BufferedImage)

2.выбор цвета линии (подумайте, какие компоненты для этого можно использовать)

3.выбор цвета фона

4.загрузка рисунка из файла

5.сохранение рисунка в файл

6.рисование графических примитивов (прямоугольник, эллипс; обратите внимание на графический контекст Graphic2D и пакет java.awt.geom)

7.рисование графических примитивов с заливкой (в том числе градиентной или по шаблону)

8.рисование линий с различными характеристиками (обратите внимание на интерфейс Stroke)

9.изменение положения изображения (например, класс AffineTransform)

10.фильтрация цветов

Следующая разработка –построитель графиков функций – в некотором смысле даже проще. Ведь построение графика можно непосредственно поместить в метод paint, нет необходимости «отлавливать» события мыши.

§ 8.

====================================================================

Еще потребуется описать в классе SimpleGraphicEditorView поле:

Снова переключитесь на вкладку JGraphicPanel.java в главном окне среды, чтобы вернуться к написанию конструктора В конструкторе сначала вызовем конструктор суперкласса (с помощью зарезервированного слова super), а затем установим размеры создаваемой панели – точно такие же, какие будут у контейнера.

Конечно, было бы вполне естественно обратиться к размерам контейнера «напрямую» (рис. 60).

Рис. 60. Нужно установить размеры панели

Но панель jGraphicPanelContainer объявлена в классе SimpleGraphicEditorView с

директивой видимости private – что делает ее недоступной для каких-либо других внешних классов. Удалить эту директиву (чтобы поле получило область видимости package) нет возможности: среда запрещает редактировать автоматически сгенерированный код. Выход состоит в том, чтобы создать метод доступа к этой панели с нужной директивой видимости. Здесь мы снова воспользуемся меню Refactor (конечно, ти изменения можно внести и вручную).

Переключитесь опять на вкладку SimpleGraphicEditorView.java и обратитесь к контекстному меню (вызвав его щелчком правой клавиши мыши на имени поля jGraphicPanelContainer). В контекстном меню выберите пункт Refactor, а в нем пункт Encapsulated Fields (создать методы доступа для полей) (рис. 61).

Рис. 61. Выберите Encapsulated Fields, чтобы создать метод доступа к полю

Впоявившемся диалоговом окне (рис. 62) будут перечислены все поля, которые имеются в классе SimpleGraphicEditorView. Для каждого из них можно создать методы доступа. Нас пока интересует только поле jGraphicPanelContainer, для которого в окне предлагается создание методов getjGraphicPanelContainer (доступ по чтению) и setjGraphicPanelContainer (доступ по записи). Метод доступа по записи нам не требуется, поэтому снимите с него пометку.

Вэтом диалоговом окне также можно указать, куда именно следует добавить вновь создаваемые методы (выбрать точку вставки, Inser Point). По умолчанию новые методы будут добавляться в конец класса (предлагается это не менять). Кроме этого можно указать способ сортировки добавляемых методов (либо парами getMMM / setMMM, либо сначала все методы getMMM, потом все методы setMMM, либо по алфавиту), особенности создания комментариев Javadoc, а также выбрать видимость поля (Field) и видимость метода доступа (Accessor). Для последнего установите default, чтобы создать метод с областью видимости пакета. Галочку Use Accessors Even When Field in Accessible (использовать метод доступа даже если поле доступно) можно снять. Можете выполнить предпросмотр (нажав кнопку Preview), а можете и сразу выполнить рефакторинг. Код пополнится новым методом (рис. 63).

Рис. 62. Диалоговое окно Encapsulate Fields

Рис. 63. Созданный get-метод

Затем следует установить backgroundColor (цвет фона) в белый, а foregroundColor (цвет рисунка) в черный. Рисунка как такового пока нет, и допустимо написать, что bufImage пока представляет собой пустую ссылку null. Устанавливать значения currentX и currentY просто не нужно. В итоге у Вас должен получиться код как на рис. .

Примечание.

Спецификация языка гласит, что все переменные объектных типов, объявленные, но не получившие никакого значения, считаются равными null (числовые переменные получают значение 0, а логические – false). Впрочем, иногда такая запись может быть полезна для программиста, особенно если он имеет планы позже написать иное, отличное от «нулевого» инициализирующее значение.

Поскольку NetBeans предоставляет свои менеджеры расположения компонентов (и то, как они работают, Вы можете видеть в секции generated code), то использовать «расположение вручную» нового компонента непосредственно на главной панели приложения может оказаться затруднительно. Поэтому мы поступим «проще» – тот JPanel, который уже помещен на главную панель, используем в качестве контейнера для нового компонента.

Новый класс можно сделать внутренним классом SimpleGraphicEditorView.

Теперь наша задача состоит в том, чтобы описать события мыши для этого компонента. private GraphicPanel gp;

Затем нужно удалить события мыши, созданные для jDrawingPanel (которая теперь jContainerPanel). Это можно сделать, обратившись к контекстному меню компонента и его вкладке Events. Выделив событие, следует нажать на кнопку с многоточием и во вновь открывшемся диалоговом окне выбрать Remove.

Теперь остается только прописать добавление компонента в конструктор

SimpleGraphicEditorView:

public SimpleGraphicView(SingleFrameApplication app) { super(app);

initComponents(); // добавленный код

gp = new GraphicPanel();

gp.setBorder(new javax.swing.border.SoftBevelBorder( javax.swing.border.BevelBorder.RAISED));

gp.setName("jGraphicPanel");

javax.swing.BoxLayout jContainerGraphicPanelLayout =

new BoxLayout(jContainerGraphicPanel, BoxLayout.Y_AXIS); jContainerGraphicPanel.setLayout(jContainerGraphicPanelLayout); jContainerGraphicPanel.add(gp);

gp.setVisible(true); // окончание добавленного кода

...

После вызова конструктора графической панели мы устанавливаем для нее рамку, назначаем имя, заводим менеджер размещения (на самом деле, поскольку это будет единственный компонент в панели jContainerGpahicPanel, то не особенно важно, какой именно менеджер размещения будет использован). Затем этот менеджер размещения устанавливается как менеджер для панели-контейнера и, наконец, графическая панель добавляется в контейнер. После этого она делается видимой.

Соседние файлы в предмете Программирование на Java