Java Swing 2D. Введение

Помечено: , , ,

  • В этой теме 0 ответов, 1 участник, последнее обновление 1 год, 5 месяцев назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #5245
      @admin

      Обзор Java 2D API

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

      основные классы графического интерфейса

      • Graphics2D (расширение Graphics) — контекст вывода. Определяет текущее графическое состояние, а также методы графического вывода. Для обратной совместимости другие классы в определении своих методов указывают Graphics, хотя реально используют Graphics2D;
      • Color — цвет;
      • Font — шрифт;
      • Point (расширение Point2D) — точка;
      • Rectangle — четырехугольник;
      • Polygon — многоугольник;
      • BasicStroke — контур сложной духмерной фигуры;
      • AffineTransform — матрица преобразования координат;
      • BufferedImage (расширение Image) — изображение, можно использовать также для вне экранного вывода совместо с Graphics2D;
      • TexturePaint — используется для заполнения фигуры текстурой;
      • GradientPaint — используется для градиентного заполнения фигуры.

      цвет

      Цвет реализуется классом Color. В нем также определены статические члены стандартных цветов, как Color.white. Ниже приведен список методов Graphics2D для работы с цветом:

      • getBackground — получить цвет очищения области;
      • setBackground — установить цвет очищения области;
      • clearRect — очистить область;
      • setColor — установить текущий цвет вывода;
      • getColor — получить текущий цвет вывода;

      фигуры

      Поддерживаются следующие классы фигур:

      • Arc2D — дуга;
      • Area — область, составная фигура (например, четырехугольник минус эллипс);
      • CubicCurve2D — сегмент кубической кривой (сплайн);
      • Ellipse2D — эллипс;
      • QuadCurve2D — сегмент квадратичной кривой (сплайн);
      • Line2D — линия;
      • Rectangle2D — четырехугольник;
      • RoundRectangle2D — четырехугольник с закругленными углами;
      • Rectangle — четырехугольник;
      • Polygon — многоугольник;
      • BasicStroke — контур сложной духмерной фигуры.

      Все эти классы реализуют интерфейс Shape:

      • contains — методы определения содержится ли указанная точка или четырехугольник внутри сложной фигуры;
      • intersects — определяет, пересекается ли сложная фигура с четырехугольником;
      • getBounds — возвращает ограничивающий сложную фигуру четырехугольник;
      • getPathIterator — возвращает итератор по сегментам сложной фигуры.

      Ниже приведен список методов Graphics2D для вывода фигур. Методы с префиксом draw выводят контур фигуры, а с префиксом fill закрашенную фигуру. Кроме цвета для закраски могут использоваться изображения или цветовые градиенты, реализуемые классами TexturePaint, GradientPaint.

      • draw — сложная фигура;
      • draw3DRect — трехмерный четырехугольник;
      • drawArc — дуга;
      • drawLine — линия, также используется для вывода точки;
      • drawPolyline — вывод последовательности линий;
      • drawOval — овал;
      • drawPolygon — многоугольник;
      • drawRect — четырехугольник;
      • drawRoundRect — четырехугольник с закругленными углами.
      • fill — сложная фигура;
      • fill3DRect — трехмерный четырехугольник;
      • fillArc — дуга;
      • fillOval — овал;
      • fillPolygon — многоугольник;
      • fillRect — четырехугольник;
      • fillRoundRect — четырехугольник с закругленными углами.

      текст и изображения

      Методы Graphics2D для вывода символов и изображения:

      • drawBytes, drawChars — вывод символов;
      • drawString — вывод строки;
      • drawImage — вывод изображения.

      преобразование координат

      Методы Graphics2D для преобразование координат:

      • getTransform — получить копию текущей матрицы преобразований;
      • setTransform — установить матрицу преобразований;
      • rotate — добавление вращения к текущей матрице;
      • scale — добавление масштабирования к текущей матрице;
      • shear — добавления скоса к текущей матрице;
      • translate — добавление сдвига к текущей матрице.

      область отсечения

      Методы Graphics2D для работы с областью отсечения:

      • setClip — установить текущую область отсечения;
      • getClip — получить текущую область отсечения;
      • getClipBounds — получить четырехугольник окружающий область отсечения;
      • clipRect — сделать пересечение с текущией областью отсечения новой областью;
      • clip — сделать пересечение сложной фигуры с текущей областью отсечения новой областью.

      интерактивность

      Методы Graphics2D для интерактивности с пользователем:

      • hit — есть ли пересечение между фигурой и четырехугольником;
      • hitClip — есть ли пересечение между областью отсечения и четырехугольником;
      • дополнительно см. методы интерфейса Shape.

      Пример вывода графики с помощью Swing 2D

      Контекст вывода Graphics или Graphics2D забирает много системных ресурсов. Поэтому если вы их создаете явно из другого Graphics, компонента, BufferedImage и т.п. (обычно это метод getGraphics), то рекомендуется освободить ресурсы явно вызовом метода dispose.

      Graphics g=a.getGraphics();
      ...
      g.dispose();

      Для вывода пользовательской графики обычно создается отдельный элемент управления, который затем размещается на главное окно. В нем перегружается метод paintComponent для Swing элементов, или методы paint и update для awt элементов.
      В этих случаях ресурсы контекста вывода освобождаются автоматически.

      Для сохранения родительского облика в методе можно сделать вызов super.paintComponent(g);. И далее дорисовать поверх. Для примера в нижеследующем коде замените JComponent на JButton и удалите очищение фона.

      import java.awt.Color;
      import java.awt.Graphics;
      import java.awt.Graphics2D;
      import java.awt.Rectangle;
      import javax.swing.JComponent;
      
      public class MyComponent extends JComponent {
      
      @Override
      protected void paintComponent(Graphics g) {	
          // super.paintComponent(g); 
          Graphics2D g2= (Graphics2D) g;
          	
          // очищаем фон
          Rectangle r=getBounds();
          g2.setBackground(Color.white);
          g2.clearRect(0, 0, r.width, r.height);	
          	
          // выводим надпись и выводим квадрат красного цвет
          g.setColor(Color.red);
          g.drawString("Hello, world", 20, 20);
          g.fillRect(60,60, 120, 120);	
          }		
      }

      Работа с изображениями в Swing 2D

      Изображения в java описываются классом BufferedImage, который объединяет в себе объект растровых данных Raster и объект цветовой модели ColorModel.

      В свою очередь объект растровых данных состоит из объекта DataBuffer, содержащего
      четырехугольный массив значений пикселей, и объекта SampleModel, описывающего организацию данных в массиве: число банков в DataBuffer, ширину и высоту изображения, тип значений в DataBuffer (например, TYPE_INT).

      Объект ColorModel нужен для преобразования данных пикселя в значения составляющих цвета.

      вывод в изображение

      Для вывода в изображение всего лишь надо получить контекст вывода изображения. Например, в следующем коде создается изображение белого многоугольника на сиреневом фоне.

      Graphics2D g;
      try {
        // создаем изображение 100*100 пикселей
        img= new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB);
        // g=(Graphics2D) img.getGraphics(); // по старому
        g=img.createGraphics(); // по новому
        g.setBackground(Color.magenta);
        g.clearRect(0, 0, 100, 100);
        g.setColor(Color.white);			
        g.fill(new Polygon( 
                   new int []{10,30,45,50,45, 45,30},
                   new int []{10,10,30,60,80, 40,80},
               7));
       g.dispose(); // освобождаем ресурсы         
      } catch (Exception e) {
         e.printStackTrace();
      }

      вывод изображения

      Для вывода изображения в объекте контекста вывода Graphics2d есть несколько методов. Для краткости я опущу типы аргументов:

      • drawImage(img, x, y, observer)
      • drawImage(img, x, y, bgcolor,observer)
      • drawImage(img, x, y, width, height, bgcolor, observer)
      • drawImage(img, x, y, width, height, observer)
      • drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, bgcolor, observer)
      • drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer)

      Первый аргумент везде само изображение.

      x, y, width, height — четырехугольная область вывода.

      dx1, dy1, dx2, dy2 — координаты четырехугольной области вывода.

      sx1, sy1, sx2, sy2 — координаты четырехугольной части изображения, которая будет выведена.

      В качестве значения аргумента observer можно указывать null. Данный аргумент нужен только при асинхронной работе с изображением.

      bgcolor — цвет заднего фона для прозрачных частей изображения.

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

      Графические форматы файлов.

      Для манипуляций с графическими файлами в Java определен класс ImageIO.
      При чтении ImageIO сам определяет формат файла. Список поддерживаемых форматов зависит от реализации Java, однако гарантируется поддержка jpeg, png, gif, bmp и wbmp. Список поддерживаемых форматов можно получить вызовом ImageIO.getWriterFormatNames()

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

      Далее подготовим само изображение, например tree.png, в любом графическом редакторе. Если вы работаете в Eclipse, киньте изображение в папку res в проекте
      (в корень проекта в старых версиях).
      Создадим оконное приложение с нашим компонентом (как было показано выше). В результате выполнения появится файл tree.gif.

      public class MyComponent extends JComponent {
      BufferedImage img;
      
      public MyComponent() {
          try {
        	// чтение
      	img = ImageIO.read(new File("tree.png"));
      
      	// запись
      	ImageIO.write(img, "gif", new File("/tree.gif"));
      
      	// выводим в консоль список поддерживаемых форматов
      	String formats[] = ImageIO.getWriterFormatNames();
      	for(String s : formats)
      	   System.out.print(s+", ");
      	} catch (Exception e) {
      	     e.printStackTrace();
      	}
      	}
      
      @Override
      protected void paintComponent(Graphics g) {
      	Graphics2D g2 = (Graphics2D) g;
      	g2.drawImage(img, 0, 0, null);
      }
      }

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.