Erro com paint (Graphics g)

OLá ! Eu fiz um projeto para desenhar ! Porém , na execução ele não funciona ! Alguem sabe o problema???

import java.awt.Graphics;

import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;

import javax.swing.JFrame;

public class Main extends JFrame {

boolean pressionado = false;


public Main() {
	addMouseListener( new MouseListener() {
		
		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			pressionado = false;
		}
		
		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			pressionado = true;
			desenhos.clear();
		}
		
		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
	});
	new Time().start();
	setSize(1300,770);
	setLocationRelativeTo(null);
	setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	
	setVisible(true);
	
	
}
ArrayList<Desenho> desenhos = new ArrayList<>();

public class Desenho {
	int x, y ;
	public Desenho(int x, int y) {
		this.y=y;
		this.x=y;
	}
}
public void paint(Graphics g) {
	for(int i=0;i<desenhos.size();i++) {
		int x = desenhos.get(i).x;
		int y = desenhos.get(i).y;
		int x2 = desenhos.get(i-1).x;
		int y2 = desenhos.get(i-1).y;
	g.drawLine(x2, y2, x, y);
	}
}
public static void main(String[] args) {
     new Main(); 

}
public class Time extends Thread{
	public void run() {
		if(pressionado) {
		try {
			
		
		Point ponto  = getMousePosition();
		desenhos.add(new Desenho(ponto.x,ponto.y));
		}catch (Exception e) {}
		}
			repaint();
		
		}
	}
}

MAin.jar (45,2,KB)

Sacanagem postar um JAR contendo somente os .class.

Pra gente identificar erro, precisamos ver seu código fonte.

Eu já mandei o código!

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;

import javax.swing.JFrame;

public class Main extends JFrame {

boolean pressionado = false;


public Main() {
	addMouseListener( new MouseListener() {
		
		@Override
		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			pressionado = false;
		}
		
		@Override
		public void mousePressed(MouseEvent e) {
			// TODO Auto-generated method stub
			pressionado = true;
			desenhos.clear();
		}
		
		@Override
		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void mouseClicked(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
	});
	new Time().start();
	setSize(1300,770);
	setLocationRelativeTo(null);
	setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	
	setVisible(true);
	
	
}
ArrayList<Desenho> desenhos = new ArrayList<>();

public class Desenho {
	int x, y ;
	public Desenho(int x, int y) {
		this.y=y;
		this.x=y;
	}
}
public void paint(Graphics g) {
	for(int i=0;i<desenhos.size();i++) {
		int x = desenhos.get(i).x;
		int y = desenhos.get(i).y;
		int x2 = desenhos.get(i-1).x;
		int y2 = desenhos.get(i-1).y;
	g.drawLine(x2, y2, x, y);
	}
}
public static void main(String[] args) {
     new Main(); 

}
public class Time extends Thread{
	public void run() {
		if(pressionado) {
		try {
			
		
		Point ponto  = getMousePosition();
		desenhos.add(new Desenho(ponto.x,ponto.y));
		}catch (Exception e) {}
		}
			repaint();
		
		}
	}
}

Você precisa sobrescrever o método paint() do JFrame e propagar o Graphics dele, ou uma cópia que é o normalmente recomendado, para os objetos da classe Desenho. Acho que vc está tentando simular uma caneta certo? Tá estranha sua ideia na verdade… Vou escrever aqui para vc um exemplo que funciona.

Na verdade esse código é do youtube :https://www.youtube.com/watch?v=CxU1TnD-xH8

Sim , estou tentando fazer uma caneta …

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 );
        }
        
    }
    
}
1 curtida

Tenho um projeto de programa de desenho bem completo aqui: https://github.com/davidbuzatto/ComputerSupportedClassHelper

Dá uma olhada, é um projeto do NetBeans. Tem um release tbm, só baixar e rodar. É um programa para uso próprio… Tem uns probleminhas, mas para as minhas necessidades resolve.

1 curtida

Muito obrigado!!! Vou ver e estudar!!

1 curtida