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.
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.
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