Afortunadamente java ofrece un gran soporte para gráficos e incluso existe una clase Graphics2D para dibujos bidimensionales. Sin embargo, en este articulo hablaremos solamente de graphics y ciertos elementos que deberás conocer para dibujar.

Primero debes saber que Graphics funciona con un sistema de coordenadas (todas las herramientas y lenguajes que soporten dibujo lo tienen). La coordenada X indica la posición horizontal del elemento y este se dibuja de izquierda a derecha, la coordenada Y funciona de arriba a abajo dibujando los elementos de esta forma. A diferencia de las coordenadas en matemáticas en Java Y se desplaza hacia abajo cuando su valor es positivo.

Ademas, la parte superior izquierda siempre tendrá las coordenadas(x, y) con valor (0, 0). Tomando esta como referencia para posicionar tus dibujos, podrás apreciar lo explicado a continuación:

La clase Graphics permite establecer colores y fuentes a sus dibujos, es posible dibujar: texto, imágenes, círculos, rectángulos, arcos, lineas y poligonos (fillPolygon, este metodo permite crear multiples dibujos como: triángulos, hexágonos y otros. Pues por parámetro debes pasar un arreglo de posiciones en X y Y logrando diversas figuras).

¿Como dibujar?

Para poder comenzar a crear nuestros primeros dibujos, debemos crear un marco y agregar un panel. El panel es nuestra hoja (literal) que permite aplicar los dibujos de la clase Graphics (el contexto grafico es nuestro panel). Ya creado nuestro marco con panel ahora debemos establecer el método para dibujar:

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

Con el método anterior seremos capaces de dibujar, es importante llamar al método padre utilizando super, pues con esto indicamos que pinte nuevamente el contexto, si usted no hace el llamado es posible que se dibuje una vez o no dibuje nada. El código completo con el marco y panel (contexto grafico) es:

package contextografico;

import javax.swing.JFrame;

public class PrimerDibujo {

    public static void main(String[] args) {
        JFrame f = new JFrame("Ventana con Contexto Grafico");
        PanelDibujo panel=new PanelDibujo(); 
        f.add(panel);
        f.setBounds(280, 150, 500, 400);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
    
}
package contextografico;

import java.awt.*;
import javax.swing.*;

public class PanelDibujo extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
    }
    
}

Aplicando métodos para dibujar

setColor(Color c): este método hace posible establecer diferentes colores a las figuras, recibe por parámetro un objecto de tipo color. La clase Color contiene una serie de constantes que indican el valor de cada color, tras escribir Color y un punto se mostraran los diferentes nombres de colores.

public class PanelDibujo extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawArc( 40, 35, 80, 80, 0, 360);
        g.drawLine(160, 75, 200, 75);
        g.setColor(Color.ORANGE);
        g.fillArc( 40, 150, 80, 70,   0, 360);
    }
    
}

Cabe mencionar que los métodos que al comienzo tienen fill tiene un comportamiento de dibujo especial y es que estos crean el dibujo relleno con el color establecido (en la imagen anterior se dibuja un arco relleno de color naranja).

Un método util conocido como translate, recibe por parámetro dos valores y son las posiciones X y Y. Al establecer el valor de coordenadas cambia el punto de origen. Por ende, los dibujos serán dibujados a partir de los valores establecidos como punto de origen, ejemplo:

public class PanelDibujo extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.CYAN);
        g.translate(this.getWidth()/2, this.getHeight()/2);
        g.fillRect(40, 10, 50, 50);
        g.fillRect(-40, -80, 50, 50);
        g.fillOval(-5, -5, 10, 10);
    }
    
}

La posición donde se encuentra el circulo dibujado, es el nuevo punto de origen y a partir de este serán dibujadas las figuras. Para obtener el centro del marco, obtienes el ancho y alto del Panel y lo divides entre 2 (podrás observar que el circulo esta centrado).

¿Dibujar una figura dentro de otra?

Algo realmente sencillo de hacer, puedes apreciar el siguiente ejemplo:

public class PanelDibujo extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.CYAN);
        g.translate(this.getWidth()/2, this.getHeight()/2);
        g.fillRect(40, 10, 50, 50);//dibujo de rectangulo
        g.setColor(Color.WHITE);
        g.drawOval(40, 10, 50, 50); //dibujo de circulo
    }
    
}

Usted simplemente deberá poner las mismas posiciones X, Y. Pues los dibujos se realizan de izquierda a derecha, con esto se asegura de dibujar figuras «anidadas».

Los métodos utilizados en los ejemplos no son todos. Para mi punto de vista los métodos mencionados, te facilitaran la creación de dibujos. Si deseas conocer los demás métodos puedes revisar el API de JAVA.