Рисование в java swing

Графика в Java

Графический контекст компонентов

Графику в Java обслуживают классы Graphics и Graphics2D.

Работа с графикой осуществляется в графическом контексте элементов, унаследованных от класса Component. Понимать это можно так: на элементах управления, например, JFrame, JPanel, JButton и других, есть возможность рисовать. Такие элементы обладают графическим контекстом, в этом контескте мы и рисуем. Всё, что нарисуем в контексте будет показано на элементе. Классы Graphics и Graphics2D нужны для работы с графическим контекстом. Мы должны получить экземпляр такого класса и, используя его методы, рисовать. Получить экземпляр контекста можно в методе paint:

этот метод наследуется из класса Component. Аргумент Graphics g создаётся системой, а мы берём его в готовом виде и используем для рисования. При создании элемента метод paint будет вызван автоматически.

Начнём изучать работу с графикой в Java с класса Graphics.

Graphics

Рассмотрим простой пример использования методов класса Graphics в Java:

Получаем:

Ниже разбираются все методы, использованные в примере.

Как начертить прямую линию?

Метод drawLine класса Graphics начертит прямую линию:

здесь 20, 30 — это координаты x, y начала линии,
360, 30 — координаты конца линии.

Как задать цвет?

Метод setColor класса Graphics сделает текущим новый цвет:

Аргументы конструктора new Color(0, 0, 255) — это красный, зелёный и синий цвета соответственно (rgb).

Как задать rgb цвета? В примере задан чисто синий цвет, т.к. значения других составляющих равны нулю. Вот чисто красный цвет:

А это чисто зеленый цвет:

Значения составляющих цвета изменяются от 0 до 255.

Светло-синий цвет, который мы использовали для заливки прямоугольника:

Как задать цвет фона?

Задать цвет фона можно методом setBackground:

Как нарисовать прямоугольник?

Методом drawRect класса Graphics:

20, 40 — это координаты верхнего левого угла прямоугольника;
340 — длина;
20 — высота прямоугольника.

Как залить прямоугольник цветом?

Методом fillRect класса Graphics:

Как нарисовать прямоугольник с закругленными углами?

Методом drawRoundRect класса Graphics.

Сопряжение, т.е. закругление на углах, делается с помощью частей овала.

первые 4 аргумента как у обычного прямоугольника. Пятый аргумент — 20 — это ширина прямоугольника, в который вписана часть овала сопряжения. Шестой аргумент — 15 — это высота прямоугольника, в который вписана часть овала сопряжения.

Читайте также:  Самопроизвольно включается экран смартфона

Как нарисовать овал?

Методом drawOval класса Graphics:

Аргументы определяют прямоугольник, в который вписан овал.

Как нарисовать окружность?

Методом drawOval класса Graphics:

Аргументы определяют прямоугольник, в который вписана окружность. Здесь рисуем овал, но длина и высота описанного прямоугольника равны, что и даёт окружность.

Как нарисовать дугу?

Методом drawArc класса Graphics:

первые 4 аргумента как у обычного прямоугольника. Пятый аргумент — 0 — это угол, от которого отсчитывается угол самой дуги. 180 — это угол дуги. Углы отсчитывают от горизонтальной оси: по часовой стрелке отрицательное направление, протв — положительное. В примере 180 градусов (величина дуги) отсчитываем от горизонтальной линии.

Как нарисовать многоугольник?

Методом drawPolygon класса Graphics:

Здесь создаём объект класса Polygon. arrayX — это х-координаты вершин многоугольника, arrayY — это y-координаты вершин многоугольника, 8 — число вершин многоугольника.

Как создать объект точки?

Для этого используем класс Point:

аргументы — это x, y координаты.

Как определить, что точка принадлежит многоугольнику?

Используем метод класса Polygon contains для определения лежит ли точка в многоугольнике.

Как вывести строку?

Методом drawString класса Graphics:

строка "Yes" будет выведена от точки с координатами 50, 190.

Как задать шрифт?

Для этого используем класс Font:

где "Tahoma" — название шрифта,
Font.BOLD|Font.ITALIC — жирный шрифт с наклоном,
40 — высота шрифта.

После задания шрифта мы делаем его текущим и выводим строку этим шрифтом:

Как задать цвет текста?

Чтоб задать цвет текста создадим и установим в графический контекст новый цвет:

Здесь мы создали чисто синий цвет. А теперь выводим строку синим цветом:

Как начертить график?

Как график функции начертить? Сначала начертим координатные оси:

А теперь построить график функции можно просто. Для этого используем метод drawPolyline класса Graphics:

График строим по точкам, xArray – это x-координаты точек, yArray – y-координаты точек графика, nPoint — это число точек.

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

прежде всего всем привет!

У меня большая проблема с этим: мне нужно создать программу, которая состоит в создании Java-интерфейса Swing, который содержит 5 квадратов и одну кнопку. Функция кнопки – нарисовать круг внутри квадратов. У меня есть этот код, но я не знаю, как продолжить.

У меня есть такие проблемы и вопросы:

  • Когда я впервые нажимаю кнопку «Далее», круг появляется и мгновенно исчезает в первом квадрате. Как я могу сделать так, чтобы круг был виден в первый раз?
  • Когда я нажимаю кнопку второй раз, во втором квадрате появляется круг. Чего я не знаю, и я хотел спросить, так это: как я могу сделать так, чтобы исчез круг в первом квадрате, и чтобы был виден только круг во втором квадрате? Я хочу сделать то же самое для случая, когда круг находится в третьем квадрате, я хочу, чтобы круг исчез во втором квадрате.
  • Если я хочу, чтобы круг появился в начале программы, но я хочу синий круг, а затем в позиции 2 °, 3 °, 4 ° и 5 ° я хочу, чтобы внутри них был красный круг, как я могу это сделать? ? (Помните, что круги появятся, когда я нажму кнопку «Далее».
Читайте также:  Сколько лет твоему компьютеру

Спасибо всем большое!

2 ответа

Есть некоторые вещи, которые вы не делаете в правильном смысле.

  1. Во-первых, вы устанавливаете свойство visible JFrame на видимое задолго до того, как фактически добавляете в него все компоненты, и заставляете его реализовать его размер.
  2. Во-вторых, вы используете Absolute Layout , которого следует избегать в большинстве ситуаций.
  3. В-третьих, вы явно создаете объект Graphics , чего следует избегать, и вместо этого используйте объект, предоставленный Java-методом paintComponent ( . ) по умолчанию.

Посмотрите на этот пример:

РЕДАКТИРОВАТЬ относительно комментария:

Все графические интерфейсы пользователя требуют своего рода основного фрейма приложения для отображения. В Swing это экземпляр javax.swing.JFrame . Поэтому наш первый шаг – создать экземпляр этого класса и убедиться, что все работает как положено. Обратите внимание, что при программировании на Swing ваш код создания GUI должен быть размещен в потоке диспетчеризации событий (EDT) , больше информации о параллелизме в Swing . Это предотвратит возможные условия гонки, которые могут привести к тупику.

DrawingBoard также переопределяет getPreferredSize , который возвращает желаемую ширину и высоту панели (в данном случае 400 – это width , 300 – это высота.) Из-за этого классу DrawingCircleExample больше не нужно указывать размер рамки в пикселях. Он просто добавляет панель в рамку и затем вызывает пакет.

Метод paintComponent – это место, где происходит все ваше пользовательское рисование. Этот метод определяется javax.swing.JComponent а затем переопределяется вашими подклассами для обеспечения их собственного поведения. Его единственный параметр, объект java.awt.Graphics , предоставляет ряд методов для рисования 2D-фигур и получения информации о графической среде приложения. В большинстве случаев объект, который фактически получен этим методом, будет экземпляром java.awt.Graphics2D (подкласс Graphics), который обеспечивает поддержку сложной визуализации 2D-графики.

Большинство стандартных компонентов Swing имеют свой внешний вид, реализованный отдельными объектами «UI Delegate». Вызов super.paintComponent (g) передает графический контекст делегату пользовательского интерфейса компонента, который рисует фон панели.

Чтобы сделать нашу собственную рисование максимально эффективной, мы будем отслеживать координаты X (в нашем случае переменную moveXBy ) и перекрашивать только те области экрана, которые изменились. Это рекомендуемая лучшая практика, которая будет поддерживать работу вашего приложения максимально эффективной.

Читайте также:  Прога для уничтожения файлов

Вызов метода repaint . Этот метод определяется java.awt.Component и является механизмом, который позволяет программно перекрасить поверхность любого данного компонента. Он имеет версию без аргументов (которая перерисовывает весь компонент) и версию с несколькими аргументами (которая перерисовывает только указанную область). Эта область также называется клипом. Вызов multi-arg версии перерисовки требует немного дополнительных усилий, но гарантирует, что ваш код рисования не будет тратить циклы перерисовки областей экрана, которые не изменились.

Поскольку мы вручную устанавливаем клип, наш метод setState вызывает метод repaint не один раз, а дважды. Первый вызов говорит Swing перерисовать область компонента, где ранее был овал (унаследованное поведение использует делегат пользовательского интерфейса, чтобы заполнить эту область текущим цветом фона.) Второй вызов закрашивает область компонента, где в данный момент находится овал. , Важно отметить, что, хотя мы вызывали repaint два раза подряд в одном и том же обработчике событий, Swing достаточно умен, чтобы взять эту информацию и перерисовать эти части экрана за одну операцию рисования. Другими словами, Swing не будет перекрашивать компонент дважды подряд, даже если это то, что, похоже, делает код.

Планировалось, что будет окно с несколькими кнопками сверху и полем. После нажатия на кнопку на поле должна прорисовываться соответствующая геом. фигура. С панелью кнопок у меня получилось как задумано: к каждой кнопке привязал объект класса MyFigure, в наследниках которого реализуется actionListener. Однако я не могу понять, в объекте какого типа мне все рисовать и откуда брать объект Graphics, который, как я понял обязателен для рисования. Код для окна:

С помощью чего мне вообще можно что-то нарисовать и как лучше это добавить? Гугл не помог. Пока вот так это выглядит:

2 ответа 2

JFrame, как и множество других элементов таких как JPanel или JButton, наследуют класс Component имеющий метод paint(Graphics g). Переопределив этот метод в вашем классе, расширяющем сам JFrame или любой другой компонент, можно вмешаться в рисование этого компонента. При следующей перерисовке компонентов, например при масштабировании окна, будет обработан и ваш код.

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

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>