Dúvidas e mais dúvidas!

Ae galera tudo bem?

Estou com um problemão, tenho que fazer um programa em java que seja um “rastreador” de dados que vem via uma porta serial. Bom estou tentando realizar a parte em que ele gerará a figura na tela deixando o rastro por onde passa. Eu tentei fazer a interface via criador de Jframe do netbeans, lá da para fazer os containers e tal, mas o problema é como eu faço a “bolinha” (localidade atual), como eu mudo a posição da bolinha através de coordenadas x e y deixando rastro? Não sei nem se estou indo pelo caminho certo… Não faço idéia de como fazer isso, procurei bem por cima da documnetação do java swing e não vi nada parecido com meu problema, alguem poderia me dar alguma ajuda?

Valeu pessoal! :smiley:

Isso não é bem Swing e sim Java2D. Que tal dar uma olhada no material que o ViniGodoy disponibiliza?

http://www.pontov.com.br/site/

Opa, valeu pela resposta!

Pelo visto o buraco é bem mais embaixo mesmo, pelo que entendi ( não sei se eu estou certo ) vou ter que usar o java2d e Threads. Vou dar umas lidas com mais carinho no material disponibilizado la no pontov, não entendi muito bem o que li na primeira vez, acho que pela falta de conhecimento mesmo… O ruim é que não tenho conhecimento em nenhum dos 2 assuntos, e ainda por cima sou burrinho pra aprender. Por favor quem tiver mais material referente ao assunto (de preferencia ao nivel “For Dummies” hahaha) ou possa dar uma ajudinha ae seria legal! :smiley:

Valeu galera! ^^

É na minha primeira tentativa não usei Threads.

Bom galera andei pesquisando e acabei por modificar um exemplo que achei na internet que ficou bem proximo do que eu pretendia, porém ainda faltam algumas melhorias.

Gostaria de pedir a ajuda dos amigos aqui também para resolver estes problemas.

Vale lembrar que eu sou bem burrinho e só consegui gerar esse codigo porque me baseie em um exemplo, portanto por favor tenham paciencia comigo.

No codigo há nos comentarios varias duvidas que se for possivel vocês olharem e responderem eu agradeceria.

Como diria Jack o Estripador, vamos por partes! Bom o primeiro problema que estou encontrando no momento é como deixar o rastro de onde o barquinho passou? Eu consegui fazer isso com base de uma gambiarra, deixando de lado o desenho de background e correndo o risco de numa minimização e maximização da janela o rastro seja perdido, sei que o que eu fiz esta incorreto e estou em busca da resposta correta. Obrigado pela atenção amigos! :smiley:

[code]package TCC;

import javax.swing.*;

public class Frame{

public Frame(){
JFrame frame = new JFrame();
frame.add(new Junta());//Populando o interior da frame
frame.setTitle(“Programa Rastreador de barquinho”); // Titulo da Frame
frame.setSize(800,600);// Tamanho da Frame
frame.setVisible(true);// Torna visivel
frame.setLocationRelativeTo(null);// O Local onde a janela sera atribuida
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main (String args[])
{
new Frame();//Chamo o Frame
}
}[/code]

[code]package TCC;

import java.awt.event.KeyEvent;
import java.awt.;
import java.awt.event.
;
import javax.swing.*;

public class Junta extends JPanel implements ActionListener {
Barquinho p; // Cria a variavel p do tipo Barquinho
public Image img; // Cria a variavel img do tipo Image
Timer time;// Cria a variavel time do tipo Timer

public Junta()
{
p = new Barquinho();// Atribui os valores da varivel p do tipo Barquinho.
addKeyListener(new AL()); // Adiciona um ouvinte do tipo teclado
setFocusable(true); // Permite que o componente conversse com teclado ou mouse caso esteja em primeira instancia
ImageIcon i = new ImageIcon(“C:/mar.png”); // Atribui o valor que esta contido no diretorio na variavel i do tipo ImageIcon.
img = i.getImage();// Atribuiu o valor de i a variavel img do tipo Image
time = new Timer(5, this); // Gera um timer de atualização a cada 5 milissegundos
time.start();// Começa a contagem

}
public void actionPerformed(ActionEvent e) { // Como o evento já é disparado se nem ao menos houve entrada no teclado?
p.move();//Chama o metodo move da variavel p
repaint();// Chamam novamente o metodo paint
}
public void paint(Graphics g) {// O que seria esse Graphics g? Só o uso porque todo mundo usa.
{
super.paint(g);// Chama o metodo paint da classe pai
Graphics2D g2d = (Graphics2D) g; // Não sei ao certo o fundamento disso, só uso porque é o que todo mundo usa.
g2d.drawImage(img, 0, 0, null);// Desenha a imagem img nas coordenadas 0 e 0. (Qual a utilidade do campo com null?)
g2d.drawImage(p.getImage(), p.getX(), p.getY(), null);// Desenha p.getImage(barco) nas coordenadas vindas de p.getX (X) e p.getY (Y).
g.drawString(“Coordenadas: (”+p.getX()+","+p.getY()+")", 645, 550);// Desanha a string que mostra as coordenadas.
}
}
private class AL extends KeyAdapter {
public void keyReleased(KeyEvent e) { // Caso a tecla seja liberada ocorrera o corpo do metodo, passando como parametro o Key event.
p.keyReleased(e);// chama o metodo da classe da variavel p
}
public void keyPressed(KeyEvent e) { // Caso a tecla seja apertada ocorrera o corpo do metodo, passando como parametro o Key event.
p.keyPressed(e);// chama o metodo da classe da variavel p
}
}
}
[/code]

Agora a gambiarra! Deixando de fora o chamado do metodo da classe pai e não desenhando o background. :
Gostaria de solucionar este problema. ;[

public void paint(Graphics g) {
{
//super.paint(g); // CANCELADO
Graphics2D g2d = (Graphics2D) g; 
//g2d.drawImage(img, 0, 0, null); // CANCELADO
g2d.drawImage(p.getImage(), p.getX(), p.getY(), null);
}
package TCC;

import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Barquinho extends JPanel{// Por que tenho que criar a herança vinda de JPanel? Pela variavel do ImageIcon?

int x, dx, y, dw;// Criada variaveis int. (OBS: Não sei porque se eu uso dy ele não funciona corretamente!)
Image barco;// Crio a variavel barco do tipo Image

public Barquinho()
{
ImageIcon i = new ImageIcon("C:/ship.png");// Atribui o valor contido no caminho em um tipo de variavel ImageIcon criada.
barco = i.getImage();// Atribuo o valor a barco referente a i;
x=0;// atribui valor 0 a x.
y=0;// atribui valor 0 a y.
}

public void move()
{
x=x+dx;//Adiciona a x o valor de dx.
y=y+dw;//Adiciona a y o valor de dy.
System.out.println("("+x+","+y+")"); // Gera no console uma mensagem contendo as coordenadas.
}

public int getX() // Cria um metodo getX para que possa ser lido o valor de x.
{
return x;// Retorna o valor de x.
}

public int getY() // Cria o metodo getY para que possa ser lido o valor de y.
{
return y;// Retorna o valor de y.
}

public Image getImage() // Cria um metodo para que possa ser passado uma image.
{
return barco;// Retorna barco que tem em seu conteudo a imagem usada.
}

public void keyPressed(KeyEvent e) // Quando o evento de tecla pressionada é chamado pela classe junta com o parametro do tipo Key Event
{
int key = e.getKeyCode(); // Pega o codigo do evento e armazena na variavel do tipo int key		
if (key == KeyEvent.VK_DOWN) // If Comparando o codigo de Key com o codigo da seta para baixo
dw = 1;		//Dw é atribuido o valor 1.
if (key == KeyEvent.VK_UP) // idem
dw = -1;		
if (key == KeyEvent.VK_LEFT)
dx = -1;
if (key == KeyEvent.VK_RIGHT)
dx = 1;
}
public void keyReleased(KeyEvent e) {// Quando o evento de tecla solta é chamado pela classe junta com o parametro do tipo Key Event
int key = e.getKeyCode(); // Pega o codigo do evento e armazena na variavel do tipo int key	
if (key == KeyEvent.VK_LEFT)// If Comparando o codigo de Key com o codigo da seta para esquerda
dx = 0; //Dx é atribuido o valor 1.
if (key == KeyEvent.VK_RIGHT) // idem
dx = 0;
if (key == KeyEvent.VK_UP)
dw = 0;
if (key == KeyEvent.VK_DOWN);
dw = 0;
}
}

Obrigado pela atenção galera! :slight_smile:

PS: Dei um update contendo as coordenadas na tela! :smiley:

Dei um up no codigo! :]