Evento click em um Graphics

6 respostas
UdusCode

Estou com um problema, preciso clicar em um elemento gráfico, o problema é que Graphics não tem o método addActionListener, queria sabe qual a forma que eu faço isso.

Código:

Classe onde todos os elementos gráficos deve estendida
abstract class GraficElements{
	private int x, y, w, h;
	private Image img;

	abstract public void paint(Graphics g);

       //Todos os get e set  aqui...
}
Classe onde cotem a lista de elementos graficos
public class Elements extends JPanel {

	public List<GraficElements> elements = new ArrayList<GraficElements>();

	public void paintComponent(Graphics g) {
		int i;
		for (i = 0; i < elements.size(); i++) {
			elements.get(i).paint(g);
		}
	}

	public List<GraficElements> getElements() {
		return elements;
	}

	public void addElemets(GraficElements ele) {
		elements.add(ele);
	}

	public void removeElements(int p) {
		elements.remove(p);
	}

	public int getSizeE() {
		return elements.size();
	}
}
Objeto Gráfico para criar uma imagem. È nesse objeto que quando for clicado devera fazer algo
public class ElementImage extends GraficElements {
	
	public ElementImage(int px, int py, int pw, int ph, String desImg) {
		setX(px);
		setY(py);
		setW(pw);
		setH(ph);
		setImg(new ImageIcon(desImg).getImage());
	}

	public void paint(Graphics g) {
		g.drawImage(getImg(), getX(), getY(), getW(), getH(), null);
		
	}
	
}
Classe Main
public class Main {

	JFrame frame = new JFrame();

	Elements elements = new Elements();

	ElementImage fundoImg = new ElementImage(0, 0, 800, 600, "fundo.png");
	ElementImage bt1 = new ElementImage(200, 100, 80, 50, "Botao1.png");
	ElementImage bt2 = new ElementImage(300, 100, 80, 50, "Botao2.png");



	public Main() {

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(800, 600);
		frame.setVisible(true);

		elements.addElemets(fundoImg);
		elements.addElemets(bt1);
		elements.addElemets(bt2);

        frame.getContentPane().add(elements);
        frame.repaint();

	}

	public static void main(String[] args) {
		FrameJogoCassanic fjc = new FrameJogoCassanic();
	}

Se alguem puder ajudar, estou precisando muito.

6 Respostas

lucasirc

adiciona evento no seu Elements, ele é um JPanel (é o seu painel de mostrar os graphics)

lucasirc

adiciona evento no seu Elements, ele é um JPanel (é o seu painel de mostrar os graphics)

UdusCode

Ta mais como eu faço isso?

E

Faça o seguinte.

a) Trabalhe sempre com Shapes ( http://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html )
b) Para verificar se alguma coisa foi clicada, ao responder ao evento de click do JPanel (onde você vai desenhar os Shapes), use o método contains ( http://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html#contains(double,%20double) ) para determinar se o clique do mouse foi dentro dessa área

Obviamente, você vai ter uma lista ou uma árvore de Shapes, então você deve obter as coordenadas do mouse quando efetuar o clique do mouse, e então percorrer os shapes até que um deles responda “true” ao método contains.

c) Você pode ter uma figura complexa, nesse caso use um Path: http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Path2D.html

UdusCode

Ok cara, vou tentar aprender shapes, mais não achei nada aqui no forum de como funciona

lucasirc
elements.addMouseListener( (1) seu listener de click do mouse );

elements.addMouseMotionListener( (2) seu listener de mouse para movimento)

(1) Voce deve colocar um objeto de uma classe que implementa MouseListener

(2) Voce deve adicionar um objeto de uma classe que implementa MouseMotionListener

estava olhando sobre shapes, tambem recomendo utilizar

voce pode utilizar um adapter

elements.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println(e.getPoint());

                 for (i = 0; i < elements.size(); i++) {  
                        if ( elements.get(i).contains(e.getPoint) {
                          System.out.println("Clickei no objeto: " + elements.get(i));                                
                        }

                 }  
            }

OBS: não utilize nome de classe no plural
OBS2: cuidado pra nao reinventar a roda, se quer adicionar um actionListener no seu botao, pq nao utilizar o Button que já possui os listeners necessários?

Criado 11 de março de 2013
Ultima resposta 12 de mar. de 2013
Respostas 6
Participantes 3