Что такое графика Java AWT?

Опубликовано: 23 Февраля, 2023

Графика — это абстрактный класс, предоставляемый Java AWT, который используется для рисования или рисования компонентов. Он состоит из различных полей, содержащих такую информацию, как компоненты для рисования, шрифт, цвет, режим XOR и т. д., а также методы, позволяющие рисовать различные фигуры на компонентах графического интерфейса. Графика является абстрактным классом и поэтому не может быть инициализирована напрямую. Объекты его дочерних классов можно получить следующими двумя способами.

1. Внутри метода paint() или update()

Он передается в качестве аргумента методам рисования и обновления и, следовательно, может быть доступен внутри этих методов. Методы paint() и update() присутствуют в классе Component и поэтому могут быть переопределены для окрашиваемого компонента.

void paint(Graphics g)

void update(Graphics g)

Пример:

MyFrame.java

Java




import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
  
public class MyFrame extends Frame {
    public MyFrame()
    {
        setVisible(true);
        setSize(300, 200);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
    public void paint(Graphics g)
    {
        g.drawRect(100, 100, 100, 50);
    }
  
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

Выход:

2. Метод getGraphics()

Этот метод присутствует в классе Component и поэтому может быть вызван для любого компонента, чтобы получить объект Graphics для компонента.

public Graphics getGraphics(): Creates a graphics context for the component. This method will return null if the component is currently not displayable.

Note: Painting must be preferably done using the paint() method. Graphics drawn via object obtained from getGraphics() method are temporary and are lost when the component is repainted again. Drawing might happen right away but repainting may take some time and therefore remove the effects of code done through getGraphics().

Пример:

MyFrame.java

Java




import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
  
public class MyFrame extends Frame {
    public MyFrame()
    {
        setVisible(true);
        setSize(300, 200);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
    public void paint(Graphics g)
    {
        System.out.println("painting...");
    }
  
    public static void main(String[] args)
    {
        MyFrame f = new MyFrame();
        Graphics g = f.getGraphics();
        System.out.println("drawing...");
        g.drawRect(100, 100, 10, 10);
        System.out.println("drawn...");
    }
}

Выход:

Этот код не будет отображать графику, нарисованную с помощью getGraphics(), потому что paint() вызывается после draw().

Java




import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
  
public class MyFrame extends Frame {
    public MyFrame()
    {
        setVisible(true);
        setSize(300, 200);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
    public void paint(Graphics g)
    {
        System.out.println("painting...");
    }
  
    public static void main(String[] args)
    {
        MyFrame f = new MyFrame();
        Graphics g = f.getGraphics();
        try {
            Thread.sleep(1000);
        }
        catch (Exception e) {
        }
        System.out.println("drawing...");
        g.drawRect(100, 100, 100, 50);
        System.out.println("drawn...");
    }
}

Выход:

Приведенный выше код отобразит прямоугольник, так как paint() вызывается перед draw(). Важные методы для установки свойств графического контекста:

  • void setClip(int x, int y, int width, int height)
  • void setClip(Shape clip)
  • void setColor(Color c)
  • void setFont(Font font)
  • void setPaintMode()
  • void setXORMode(Color c1)

Режим рисования против режима Xor

В режиме рисования новый вывод заменяет предыдущий. Поэтому, если цвет, установленный в графическом объекте, совпадает с цветом фона, объект не виден. В режиме Xor цвет нового вывода получается путем операции XOR предоставленного цвета с цветом фона и графики. Поэтому объект всегда виден независимо от цвета фона.

Пример:

Java




import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
  
public class MyFrame extends Frame {
    public MyFrame()
    {
        setVisible(true);
        setSize(300, 200);
        setBackground(Color.red);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
    public void paint(Graphics g)
    {
        g.setColor(Color.green);
        g.setXORMode(Color.black);
        g.fillRect(100, 100, 100, 50);
    }
  
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

Выход:

В приведенном выше коде

color set for graphics is: green   (00000000 11111111 00000000)
background-color is: red       (11111111 00000000 00000000)
color provided for XOR: black    (00000000 00000000 00000000)
color obtained for rendering the output = green XOR red XOR black  = yellow (11111111 11111111 00000000)

Рисование фигур с помощью графического объекта

Линия

Для рисования линии используется следующий метод класса Graphics:

void drawLine(int startX, int startY, int endX, int endY)

Пример:

Java




import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
  
public class MyFrame extends Frame {
    public MyFrame()
    {
        setVisible(true);
        setSize(300, 300);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
    public void paint(Graphics g)
    {
        g.drawLine(100, 100, 200, 200);
    }
  
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

Выход:

Прямоугольник

Для рисования прямоугольников используются следующие методы класса Graphics:

  • void drawRect(int x, int y, int width, int height)
  • void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
  • void fillRect(int x, int y, int width, int height)
  • void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)

Пример:

Java




import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
  
public class MyFrame extends Frame {
    public MyFrame()
    {
        setVisible(true);
        setSize(300, 300);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
    public void paint(Graphics g)
    {
        g.drawRect(50, 60, 50, 20);
        g.drawRoundRect(50, 90, 50, 20, 10, 10);
        g.fillRect(50, 120, 50, 20);
        g.fillRoundRect(50, 150, 50, 20, 10, 10);
    }
  
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

Выход:

Овал и круг

Для рисования овалов и кругов используются следующие методы:

  •  void drawOval(int x, int y, int width, int height)
  • void fillOval(int x, int y, int width, int height)

Пример:

Java




import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
  
public class MyFrame extends Frame {
    public MyFrame()
    {
        setVisible(true);
        setSize(300, 300);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
    public void paint(Graphics g)
    {
        g.drawOval(50, 100, 50, 30);
        g.fillOval(120, 100, 50, 30);
        g.drawOval(50, 150, 50, 50);
        g.fillOval(120, 150, 50, 50);
    }
  
    public static void main(String[] args)
    {
        new MyFrame();
    }
}

Выход:

Дуга

Для рисования дуг используются следующие методы класса Graphics:

  • void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
  • void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)

Пример:

Java




import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
  
public class MyFrame extends Frame {
    public MyFrame()
    {
        setVisible(true);
        setSize(300, 300);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e)