Travei

8 respostas
M

Ae galera, beleza??

Eu to desenvolvendo um aplicativo usando Swing que é basicamente uma bola andando pelo JPanel e gravando suas coordenadas nos vetores objX e objY (o primeiro pra coord x e o segundo pra coord Y).

O usuário vai seguir a bola com o ponteiro do mouse, e as coordenadas do movimento do mouse são gravadas em coordX e coordY.

Ao rodar, eu sigo a bola com o mouse e ao clicar em "Close" é exibida as coordenadas do movimento do mouse e do objeto. O problema é que ao comparar as coordenadas do mouse e do objeto, elas são bem diferentes mesmo que eu acompanhe a bola com o mouse de bem próximo. Eu imagino que o eixo [0,0] está deslocado para a bola, mas não sei como arrumar isso.

E outro probleminha é que as coordenadas do mouse param de ser gravadas no meio do caminho.. E não sei porque... Ainda sou iniciante em Swing e captar eventos do mouse..

Desculpem-me pelo post longo. :?

Segue abaixo o código do aplicativo.. Por favor dêem uma ajudinha.

Classe principal BounceThread
import javax.swing.JFrame;

public class BounceThread {
	public static void main(String[] args) {
		JFrame frame = new BounceThreadFrame();
		frame.setVisible(true);
	}

}
Classe do Frame
public class BounceThreadFrame extends JFrame {
	public BounceThreadFrame() {
		setSize(800, 600);
		setTitle("Bounce");

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		Container contentPane = getContentPane();
		canvas = new JPanel();
		contentPane.add(canvas, "Center");
		JPanel p = new JPanel();
		addButton(p, "Start", new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				Ball b = new Ball(canvas);
				b.start();
			}
		});

		addButton(p, "Close", new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				canvas.setVisible(false);
				
				System.exit(0);
			}
		});
		
		contentPane.add(p, "South");
		
	}
	public void addButton(Container c, String title, ActionListener a) {
		JButton b = new JButton(title);
		c.add(b);
		b.addActionListener(a);
	}
	private JPanel canvas;
}
Classe da Bola (contém o MouseMotionListener e coordenadas)
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JPanel;

public class Ball extends Thread {
	public Ball(JPanel b) {
		box = b;
	}

	public void draw() {
		Graphics g = box.getGraphics();
		g.fillOval(x, y, XSIZE, YSIZE);
		g.dispose();
	}

	public void move() {
		if (!box.isVisible())
			return;
		Graphics g = box.getGraphics();
		g.setXORMode(box.getBackground());
		g.fillOval(x, y, XSIZE, YSIZE);
		x += dx;
		y += dy;

		Dimension d = box.getSize();
		if (x < 0) {
			x = 0;
			dx = -dx;
		}
		if (x + XSIZE >= d.width) {
			x = d.width - XSIZE;
			dx = -dx;
		}
		if (y < 0) {
			y = 0;
			dy = -dy;
		}
		if (y + YSIZE >= d.height) {
			y = d.height - YSIZE;
			dy = -dy;
		}

		g.fillOval(x, y, XSIZE, YSIZE);
		g.dispose();
	}

	public void run() {
		try {
			MouseHandler handler = new MouseHandler();
			box.addMouseMotionListener(handler);
			draw();
			for (int i = 1; i <= 1000; i++) {
				move();
				sleep(5);
				objX[i] = x;
				objY[i] = y;
				
			}
			for (int a = 0; a < objX.length; a++)
				System.out.println("["+coordX[a]+","+coordY[a]+"]"+" - "+"["+objX[a] + ", " + objY[a]+"]");
		} catch (InterruptedException e) {
		}
	}

	private class MouseHandler implements MouseMotionListener {

		public void mouseMoved(MouseEvent e) {
			saveCoord(e.getX(), e.getY());
		}

		public void mouseDragged(MouseEvent e) {
		}
		

	}
	public void saveCoord(int x, int y) {
		coordX[m] = x;
		coordY[m] = y;
		m++;
	}

	private int[] coordX = new int[1000000];

	private int[] coordY = new int[1000000];

	private int m = 0;
	
	private JPanel box;

	private static final int XSIZE = 50;

	private static final int YSIZE = 50;

	private int x = 0;

	private int y = 0;

	private int dx = 1;

	private int dy = 1;

	private int[] objX = new int[1001];

	private int[] objY = new int[1001];

}

EDIT:
Eu limitei o movimento da bola pra 1000.

E o objetivo do aplicativo é fazer uma comparação entre as coordenadas x e y do mouse e do objeto, e calcular o quão bem o usuário seguiu a bola. E então dizer isso ao usuário num JDialog provavelmente.

8 Respostas

ViniGodoy

Sua bola segue as coordenadas do JPanel, enquanto o mouse da janela.

Há duas formas de corrigir isso:

  1. Esqueça o JPanel e desenha diretamente na janela, sobrescrevendo o método paint dessa;
  2. Some as coordenadas x e y do seu JPanel às coordenadas da bola.
M

Entendo…

Eu prefiro seguir com a JPanel porque como não sei lidar muito bem com Swing ainda…

Portanto, eu tenho que seguir sua segunda sugestão. Eu só não entendi ela muito bem.

A bola usa está no plano do JPanel que tem uma dimensão diferente que a janela, um centro deslocado certo?

Eu não entendi o porque tenho que somar as coordenadas do JPanel às coordenadas da bola… A bola já não utiliza X e Y do JPanel? Eu estaria dobrando as coordenadas não estaria?

Valeu pela resposta.

ViniGodoy

A bola usa as coordenadas do JPanel. Mas o mouse, que você imprime, usa as coordenadas da janela.

Por isso a diferença que vc citou das coordenadas do mouse e da bola. As do mouse serão sempre maiores pois ele se baseia no topo esquerdao da janela, embaixo da barra de título. Já a bola, baseia-se no topo esquerdo do painel, que começa logo abaixo da barra te título.

Somar o x e y do painel é, na verdade, transformar o sistema de coordenadas da bola (que é o do painel) no sistema de coordenadas da janela.

M

Como exatamente eu faço essa passagem de coordenadas?

Vou ter que retirar todo o JPanel mesmo?

Valeu pelas respostas cara,

Abraço.

ViniGodoy

Você tem duas alternativas:

  1. Some o x e y do painel nas coordenadas da bola (assim vc obtém as coordenadas da bola em relação a janela);
  2. Subtraia o x e y do painel nas coordenadas no mouse (assim você tem a coordenada do mouse em relação ao painel).

O que for mais adequado a sua aplicação.

M

Desculpa minha falta de visão, mas eu não sei a quais coordenadas x e y você está se referindo.

Eu tenho as coordenadas do mouse e as da bola. E não é nenhuma das duas.

Sei que a janela e o JPanel têm centros diferentes, mas que coordenadas x e y do JPanel são essas? Como que faço para pegá-las ? :?:

:frowning: .

Obrigado.

M

bump :frowning:

M

Não consigo resolver, e parece ser um problema tão simples. ¬¬

Só preciso trocar o sistema de coordenadas do JPanel para o sistema da janela, mas não consigo. Procurei na internet e não achei e o DEITEL também não.

Falta isso e checar o porque as coordenadas do mouse não estão sendo gravadas direito… Sempre para na metade do caminho…

Por exemplo: O limite do movimento da bola é de 1000, e os vetores das coordenadas da bola são preenchidos até o fim… Mas os do mouse para no meio do caminho… A partir do meio do caminho fica tudo [0,0].

Mas esse é o de menos.

Criado 11 de abril de 2010
Ultima resposta 14 de abr. de 2010
Respostas 8
Participantes 2