Paint Java - Duplicando mensagem

4 respostas
W

Boa noite galera, sou novato no clube …e tbm estou iniciando em Java, tenho um trabalho chato para entregar esta semana em java…com o objetivo de realizar um paint bem arcaico.

Mas estou com um problema, vamos lá:

Metodo main - Instanciando retangulo:

if (Figura == 1)
  	{
                         		Retangulo retangulo = new Retangulo();
			retangulo.setVisible(true); 
			retangulo.setDefaultCloseOperation(
			JFrame.EXIT_ON_CLOSE);
           }

Classe retangulo:

public void paint(Graphics g){   
	largura = Integer.parseInt(JOptionPane.showInputDialog(null,"Digite a Largura do retangulo:"
	                ,"Largura escolhida",JOptionPane.QUESTION_MESSAGE));
	                altura = Integer.parseInt(JOptionPane.showInputDialog(null,"Digite a altura do retangulo:"
	               ,"Altura escolhida",JOptionPane.QUESTION_MESSAGE));
                           super.paint(g);
                           g.drawRect(x,y, altura, largura);       
}

Tenho uma super classe - Figura

Ao executar o Main e selecionar a opção (Desenhar retangulo) o sistema exibe duas vezes a mensagem , ou seja:

Digite a Largura do retangulo : …
Digite a altura do retangulo: …

----Uma vez e depois chama novamente as mesmas mensagens

Digite a Largura do retangulo : …
Digite a altura do retangulo: …

Ja fiz de tudo…google, livro e tal…

Me ajudem…valeu galera…

Abracos

4 Respostas

davidbuzatto

Se vc estiver chamando o paint de retângulo dentro do paint do JFrame, realmente cada vez que o frame for ser repintado, o seus JOptionPanes vão ser chamados.
A classe retângulo deve ser apenas o retângulo e não deve se precupar em obter os dados do usuário. Uma boa coisa para se fazer tbm é colocar o pintura para ser feita dentro de um painel, ai vc pode usar ele como componente no seu JFrame. A obtenção dos dados deve ficar fora do paint. Primeiro pege os dados, depois chame repaint no componente.

Olhe o exemplo abaixo.

Figura.java
import java.awt.Graphics;

/**
 *
 * @author David
 */
public abstract class Figura {

    private int x;
    private int y;
    private int larg;
    private int alt;

    public abstract void paintMe( Graphics g );

    public int getX() {
        return x;
    }

    public void setX( int x ) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY( int y ) {
        this.y = y;
    }

    public int getLarg() {
        return larg;
    }

    public void setLarg( int larg ) {
        this.larg = larg;
    }

    public int getAlt() {
        return alt;
    }

    public void setAlt( int alt ) {
        this.alt = alt;
    }

}
Retangulo.java
import java.awt.Graphics;

/**
 *
 * @author David
 */
public class Retangulo extends Figura {

    @Override
    public void paintMe( Graphics g ) {
        g.drawRect( getX(), getY(), getLarg(), getAlt() );
    }

}
Circulo.java
import java.awt.Graphics;

/**
 *
 * @author David
 */
public class Circulo extends Figura {

    @Override
    public void paintMe( Graphics g ) {
        g.drawOval( getX(), getY(), getLarg(), getAlt() );
    }

}
PainelFiguras.java
import java.awt.Color;
import java.awt.Graphics;
import java.util.List;
import javax.swing.JPanel;

/**
 *
 * @author David
 */
public class PainelFiguras extends JPanel {

    private List<Figura> figuras;

    public PainelFiguras( List<Figura> figuras ) {
        this.figuras = figuras;
    }

    /* Classess que derivam de JComponente (como JPanel) tem o método paintComponent
     * para ser sobrescrito.
    @Override
    protected void paintComponent( Graphics g ) {
        super.paintComponent( g );

        // "apaga" o desenho anterior, pintando um retângulo branco
        g.setColor( Color.WHITE );
        g.fillRect( 0, 0, getHeight(), getWidth() );

        // se existirem figuras, pinta cada uma
        g.setColor( Color.BLACK );
        if ( figuras != null ) {
            for ( Figura f : figuras ) {
                f.paintMe( g );
            }
        }
    }

    public void setFiguras( List<Figura> figuras ) {
        this.figuras = figuras;
    }

}
Janela.java
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author David
 */
public class Janela extends JFrame implements ActionListener {

    private JButton btn;
    private PainelFiguras painel;

    public Janela() {

        btn = new JButton();
        btn.setText( "Criar Figuras e Pintar!" );
        btn.addActionListener( this );

        painel = new PainelFiguras( null );

        add( btn, BorderLayout.SOUTH);
        add( painel, BorderLayout.CENTER );

        setTitle( "Pintando Figuras" );
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        setSize( 300, 300 );
        setVisible( true );

    }

    public void actionPerformed( ActionEvent e ) {

        try {

            List<Figura> figuras = new ArrayList<Figura>();
            Retangulo r = new Retangulo();
            r.setX( 10 );
            r.setY( 20 );
            r.setLarg( Integer.parseInt( JOptionPane.showInputDialog( "Digite a largura do retângulo" ).trim() ) );
            r.setAlt( Integer.parseInt( JOptionPane.showInputDialog( "Digite a altura do retângulo" ).trim() ) );

            Circulo c = new Circulo();
            c.setX( 10 );
            c.setY( 20 );
            c.setLarg( Integer.parseInt( JOptionPane.showInputDialog( "Digite a largura do círculo" ).trim() ) );
            c.setAlt( Integer.parseInt( JOptionPane.showInputDialog( "Digite a altura do círculo" ).trim() ) );

            figuras.add( r );
            figuras.add( c );

            painel.setFiguras( figuras );
            painel.repaint();

        } catch ( NumberFormatException exc ) {

            JOptionPane.showMessageDialog( null, "Você digitou algum dado errado!\nTente Novamente!");

        }

    }

    public static void main( String[] args ) {
        Janela j = new Janela();
    }

}

Qualquer dúvida, pergunte.

[]´s

W

Valeu David pelas enorme dica…

Mas nao entendi e tbm nao funcionou a declaracao

List figuras = new ArrayList();
private List figuras;

nas classes Janela e PainelFiguras.

Obs:A incompatibilidade nao seria por conta que nas classes Janela e PainelFiguras nao estão “extends” para a classe Figura.

Aguardo seu retorno.

davidbuzatto

Williammega:
Valeu David pelas enorme dica…

Mas nao entendi e tbm nao funcionou a declaracao

List figuras = new ArrayList();
private List figuras;

nas classes Janela e PainelFiguras.

Obs:A incompatibilidade nao seria por conta que nas classes Janela e PainelFiguras nao estão “extends” para a classe Figura.

Aguardo seu retorno.

O código está correto. Janela e PainelFiguras não são especializações de Figura.
Qual versão do Java vc está usando? Esse código é para Java >= 5.0
Vc colocou os imports nas classes?
Se vc estiver usando Java < 5.0 recomendo vc atualizar o JDK.

W

Era o Jdk que estava desatualizado…
Obrigado por tudo.

Criado 7 de novembro de 2009
Ultima resposta 8 de nov. de 2009
Respostas 4
Participantes 2