JFame dúvida

Boas pessoal espero que esteja tudo bem convosco.

Estou a desenvolver um trabalho usando apenas o JFrame, e tenho de momento, uma janela com dois circulos e uma linha que os une (sei que é muito básico mas ainda sou muito júnior e estou a iniciar agora) e a minha questão é como posso fazer com que nessa janela seja possivel desenhar livremente por cima dos circulos e da linha e ainda se é possivel fazer com que: se eu desenhar algo dentro do circulo automaticamente o círculo muda de cor.

Agradecido pela atenção.

É possível, mas depende de como vc fez, também será trabalhoso.

Primeiro crie uma classe Circulo, Linha e Canvas*, EXEMPLO:

class Circulo {
  void desenhar(Graphics g) {
    g.setColor(obterCor());
    g.fillCircle(obterPosicao(), obterRaio());
  }
}

class Linha {
  void desenhar(Graphics g) {
    g.setColor(obterCor());
    g.drawLine(obterP1(), obterP2());
}

class Canvas {
  BufferedImage imagem = new BufferedImage(500, 500, BufferedImage.INT_ARGB);// tamanho do JFrame
  void desenhar(Graphics g) {
    g.draw(0, 0, imagem);
}

Se souber usar interface, crie uma com o método desenhar

No JFrame, crie uma lista que armazena os itens:

ArrayList lista = new ArrayList();
lista.add(linha);
lista.add(circulo1);
lista.add(circulo2);
lista.add(canvas);

E no paintComponent:

g.setColor(Color.BRANCO);
g.fillRect(0,0, getWidth(), getHeight()); // limpa a tela

// desenha os itens da lista
for (int i = 0; i < lista.size(); i=i+1) {
    lista.get(i).desenhar(g);
}

Teste, até aqui deverá exibir o desenho que vc fez.

Agora vem o “Lápis”, use o mouseListener e o mouseMotionListener no JFrame:

Se pressionar e mover o mouse (drag) {
    canvas.desenharPonto(mouse.getX(), mouse.getY());
    jframe.repaint(); // avisa o jframe para atualizar a tela
}

O método no canvas:

void desenharPonto(x, y) {
    imagem.setRGB(x, y, Color.PRETO);
}

Teste, agora poderá desenhar por cima.

Por ultimo, atualize os listeners para alterar a cor dos círculos::

Se circulo1.contemPonto(mouse.getX(), mouse.getY()) {
  circulo1.atribuirCor(VERMELHO);
} senão {
  circulo1.atribuirCor(AZUL);
}

Se circulo2.contemPonto(mouse.getX(), mouse.getY()) {
  circulo2.atribuirCor(VERMELHO);
} senão {
  circulo2.atribuirCor(AZUL);
}

jframe.repaint();

https://docs.oracle.com/javase/tutorial/uiswing/events/mouselistener.html
https://docs.oracle.com/javase/tutorial/uiswing/events/mousemotionlistener.html