Metodo Repaint

3 respostas
C

Bom dia galera…

Estou querendo implementar um JPanel que toda vez que eu clicar com o mouse em um determinado ponto, seja desenhado um circulo na tela porem apague o anterior

o programa funciona perfeitamente, Porem ao inves de repintar todo o componente ele simplesmente adiciona outro circulo e nao executa o Repaint como deveria, ou seja repintar todo o componente, porem ele apneas esta adicionando a nova pintura e nao repintando como deveria.

seguem os codigos fontes.

package jogo;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Jogo extends FramePrincipal {
	
	private static int x,y;
	private static Fase fase;
	
	public Jogo(){
		//super();
		setTitle("Mouse");
		//addMouseListener(new Acoes());
		fase = new Fase();
		fase.addMouseListener(new Acoes());
		add(fase);
		
	}
	
	 static class Acoes extends MouseAdapter{
		public void mouseClicked(MouseEvent e){
			x = e.getX();
			y = e.getY();
			//System.out.println(x + y);
			fase.drawing(x, y);
		}
	}
}
package jogo;

import java.awt.*;

import javax.swing.JPanel;

public class Fase extends JPanel{
	
	private static int x,y;
	
	
	public void drawing(int xx, int yy){
		x = xx;
		y = yy;
		repaint(); // a chamada eh feita e a pintura acontece, porem a pintura anterior ainda continua presente
	}
	
	public void paintComponent(Graphics g){
		super.paintComponents(g);
		//g.dispose();
		g.setColor(Color.RED);
		setBackground(Color.BLACK);
		//g.drawRect(x, y, 20, 20);
		g.fillOval(x, y, 20, 20);
		
		
	}

}

Alguma sugestao?

abraço

3 Respostas

P

tenta usar o updateUI();

E
  1. Muito static - vou tirar todos (você não está sabendo passar as informações de um frame para um jpanel :frowning: )

  2. use validate, não repaint

E

Desculpe, é repaint mesmo. Vou passar aqui o código modificado (usei o WindowBuilder) :

package guj;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class Jogo extends JFrame {
    private Fase panel;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Jogo frame = new Jogo();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Jogo() {
        setBounds(100, 100, 450, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().add(getPanel(), BorderLayout.CENTER);

    }

    private Fase getPanel() {
        if (panel == null) {
            panel = new Fase();
            panel.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    int x = e.getX();
                    int y = e.getY();
                    panel.setPoint(x, y);
                }
            });
        }
        return panel;
    }
}
package guj;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

public class Fase extends JPanel {

    /**
     * Create the panel.
     */
    public Fase() {
        x = 0;
        y = 0;
    }

    @Override
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setColor(Color.RED);
        g2d.setBackground(Color.BLACK);
        g2d.fillOval(x, y, 20, 20);
        g2d.dispose();
    }

    public void setPoint(int x, int y) {
        this.x = x;
        this.y = y;
        repaint();
    }

    private int x;
    private int y;
}

Não precisa usar nenhum static (se você está usando static e não é para definir uma constante ou um singleton, alguma coisa você está fazendo de errado)

Criado 11 de junho de 2012
Ultima resposta 11 de jun. de 2012
Respostas 3
Participantes 3