Bem… Vamos lá…
A estratégia que você adotou de sobrescrever o método paint do JFrame e usar uma thread para ficar pegando os pontos e inserindo no desenho é um tanto quanto falha. Alguns motivos: 1) você consegue ouvir o evento de arraste do mouse (clicar e arrastar) em um componente usando o método mouseDragged de um MouseMotionListener; 2) sobrescrever o método paint do JFrame não vai fornecer double buffering, sendo assim, mesmo que seu código funcionasse, você teria flickering no desenho da janela; 3) você tentou implementar algo que já existe, mas sem saber muito bem o que estava fazendo.
Enfim, no código abaixo há três classes. A sua classe Main modificada que é o seu JFrame, a classe Desenho simplificada e usando um Path2D para armazenar as coordenadas do desenho e a classe PainelDesenho que é o “motor gráfico” do programa. É só pensar um pouco que dá para entender o que foi feito, mas se tiver dúvida, posta de novo que eu explico (se eu estiver acordado kkk).
Classe Main:
/**
*
* @author David
*/
import javax.swing.JFrame;
public class Main extends JFrame {
public Main() {
// adiciona um novo painel de desenho no JFrame
add( new PainelDesenho() );
// configurações...
setSize( 1300, 770 );
setLocationRelativeTo( null );
setDefaultCloseOperation( EXIT_ON_CLOSE );
setVisible( true );
}
public static void main( String[] args ) {
new Main();
}
}
Classe Desenho:
import java.awt.Graphics2D;
import java.awt.geom.Path2D;
/**
*
* @author David
*/
public class Desenho {
// caminho do desenho
private Path2D.Double caminho;
// é a primeira inserção de um ponto do caminho?
private boolean primeiraInsercao;
public Desenho() {
caminho = new Path2D.Double();
primeiraInsercao = true;
}
public void adicionarPonto( int x, int y ) {
// se for a primeira inserção, move o "cursor" do caminho
// para a coordenada
if ( primeiraInsercao ) {
caminho.moveTo( x, y );
primeiraInsercao = false;
} else { // caso contrário, desenha uma linha até a próxima coordenada
caminho.lineTo( x, y );
}
}
// pinta o desenho
public void paint( Graphics2D g2d ) {
// copia o contexto gráfico
g2d = (Graphics2D) g2d.create();
// desenha o caminho
g2d.draw( caminho );
}
}
Classe PainelDesenho:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
/**
*
* @author David
*/
public class PainelDesenho extends JPanel {
// lista de desenhos
private List<Desenho> desenhos;
// o desenho que está sendo feito atualmente
private Desenho desenhoAtual;
public PainelDesenho() {
desenhos = new ArrayList<>();
addMouseListener( new MouseAdapter() {
// mouse pressionado no painel
@Override
public void mousePressed( MouseEvent e ) {
// cria um novo desenho
desenhoAtual = new Desenho();
// adiciona um ponto (o primeiro)
desenhoAtual.adicionarPonto( e.getX(), e.getY() );
// repinta o componente (não se invoca paint ou
// paintComponent explicitamente)
repaint();
}
// mouse solto no painel
@Override
public void mouseReleased( MouseEvent e ) {
// o desenho atual está pronto, adiciona na lista de desenhos
desenhos.add( desenhoAtual );
// prepara para um próximo desenho
desenhoAtual = null;
// repinta
repaint();
}
} );
addMouseMotionListener( new MouseAdapter() {
// mouse arrastando (clique + movimento)
@Override
public void mouseDragged( MouseEvent e ) {
// se o desenho atual não for nulo
if ( desenhoAtual != null ) {
// insere um novo ponto no desenho
desenhoAtual.adicionarPonto( e.getX(), e.getY() );
}
// repinta
repaint();
}
});
}
// pintura do painel
@Override
public void paintComponent( Graphics g ) {
// obrigatório, garante o funcionamento do mecanismo gráfico
super.paintComponent( g );
// cria um novo contexto gráfico com base no original
Graphics2D g2d = (Graphics2D) g.create();
// configura o contexto para usar suavização
g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON );
// se há um desenho sendo feito no momento
if ( desenhoAtual != null ) {
// desenha
desenhoAtual.paint( g2d );
}
// desenha todos os desenhos já feitos
for ( Desenho desenho : desenhos ) {
desenho.paint( g2d );
}
}
}