É 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