PDA

Visualizza la versione completa : [JAVA] Muovere un disegno all'interno di un Panel


Virtual147
18-01-2006, 19:24
Salve a tutti.. questo il mio primo post.. Sono alle prime armi con il Java e avrei 1 problema che nn riesco a risolvere.. ora ve lo spiego cercando di essere pi chiaro possibile..


Io devo far muovere un piccolo disegno che creo cn la paint..
Questo disegno si trova in un panel "center".
Con le classi MouseMotionEvent e usando la procedura mouseMoved ho creato 2 variabili dove cn GetX e Gety prendo le posizioni attuali..e richiamando una procedura contenuta nella classe dove c' anche la Paint passo queste coordinate nell'altra classe e nella paint le metto cm cordinate dell'oggetto da fare muovere..
Risultato l'oggetto nn si muove rimane sempre a 0,0...

Questo come la mouse moved che ho fatto nella classe main e attraverso m1.passacordx e m1.passacordy passo in teoria le coordinate nella classe dove ce la Paint


public void mouseMoved(MouseEvent e){
int x2;
int y2;
x2=e.getX();
y2=e.getY();
m1.passacordx(x2);
m1.passacordy(y2);

}


Ho anche messo questo che credo che serva nella procedura main..


addMouseMotionListener(this);


Questo sono le 2 procedure nella classe dove c' anche il Paint..


public void passacordx(int x2){
xmir=x2;

}
public void passacordy(int y2){
ymir=y2;
}

Dopo con queste 2 variabili all'interno della main disegno ma quando lo faccio partire rimane sempre a 0,0 e se muovo il muose nn succede nulla :bh:

Cosa Sbaglio.. serve qualcos altro?? da poco che uso Java se qualcuno pu mi aiuti..


Grazie.

unomichisiada
18-01-2006, 19:41
Originariamente inviato da Virtual147
Salve a tutti.. questo il mio primo post.. Sono alle prime armi con il Java e avrei 1 problema che nn riesco a risolvere.. ora ve lo spiego cercando di essere pi chiaro possibile..


Io devo far muovere un piccolo disegno che creo cn la paint..
Questo disegno si trova in un panel "center".
Con le classi MouseMotionEvent e usando la procedura mouseMoved ho creato 2 variabili dove cn GetX e Gety prendo le posizioni attuali..e richiamando una procedura contenuta nella classe dove c' anche la Paint passo queste coordinate nell'altra classe e nella paint le metto cm cordinate dell'oggetto da fare muovere..
Risultato l'oggetto nn si muove rimane sempre a 0,0...

Questo come la mouse moved che ho fatto nella classe main e attraverso m1.passacordx e m1.passacordy passo in teoria le coordinate nella classe dove ce la Paint


public void mouseMoved(MouseEvent e){
int x2;
int y2;
x2=e.getX();
y2=e.getY();
m1.passacordx(x2);
m1.passacordy(y2);

}


Ho anche messo questo che credo che serva nella procedura main..


addMouseMotionListener(this);


Questo sono le 2 procedure nella classe dove c' anche il Paint..


public void passacordx(int x2){
xmir=x2;

}
public void passacordy(int y2){
ymir=y2;
}

Dopo con queste 2 variabili all'interno della main disegno ma quando lo faccio partire rimane sempre a 0,0 e se muovo il muose nn succede nulla :bh:

Cosa Sbaglio.. serve qualcos altro?? da poco che uso Java se qualcuno pu mi aiuti..


Grazie.
Posta il codice,meglio se tutto cos si possono fare prove direttamente.A meno che non sia chilometrico...

Virtual147
18-01-2006, 20:33
Ecco tutto il Programma...


Questo il main...


package javaapplication4;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseMotionAdapter;
import java.util.LinkedList;
import javax.swing.*;
import java.awt.Event.*;


public class Main extends Frame implements ActionListener, KeyListener, MouseListener, MouseMotionListener {
public static int pos=50;
public int tim=0;
public int q=0;
public int w=0;
public int prec=0;

Astro m1=new Astro(pos);



public Main() {

Panel comandi=new Panel();
pos=50;

setBackground(Color.BLUE);
setLayout(new BorderLayout());
setSize(500, 500);
setLocation(500,500);
add(m1,"Center");
ChiudiFinestra Cf = new ChiudiFinestra();
Timer tempo = new Timer(3000,this);
tempo.start();
addWindowListener(Cf);
addKeyListener(this);
addMouseMotionListener(this);
addMouseListener(this);
setVisible(true);

}

public static void main(String[] args) {
new Main();

}
public void keyPressed(KeyEvent e){
int keycod=e.getKeyCode();
if (keycod==KeyEvent.VK_UP){
m1.spostasu();
m1.ridisegna();
}
if (keycod==KeyEvent.VK_DOWN){
m1.spostagiu();
m1.ridisegna();
}
if (keycod==KeyEvent.VK_LEFT){ //Tastiera
m1.spostasinistra();
m1.ridisegna();
}
if (keycod==KeyEvent.VK_RIGHT){
m1.spostadestra();
m1.ridisegna();
}
if (keycod==KeyEvent.VK_SPACE){
m1.spara();
m1.ridisegna();
}
}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}

public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}


public void mouseMoved(MouseEvent e){
int x2;
int y2;
x2=e.getX(); // Comandi x il mouse
y2=e.getY();
m1.passacordx(x2);
m1.passacordy(y2);

}
public void mouseDragged(MouseEvent e){}


public void actionPerformed(ActionEvent e)
{

q=(int)((Math.random()*7)+1);
if(q!=prec){

m1.compari(q);
}
else{
q=(int)((Math.random()*7)+1);

m1.compari(q);
}
prec=q;

m1.ridisegna();


}

}


E questa l'altra classe...


package javaapplication4;
import java.awt.*;
import javax.swing.*;
import java.awt.Event.*;


public class Astro extends Canvas{
Astro mv;
int x;
int y;
int bers;
int x1=30;
int y1=30;
int zoomstella=5;
int vai=0;
int colpito=0;
int cartuccie=1;
int volte=0;
int xorso;
int yorso;
int xmir;
int ymir;
Image bv;
Graphics of;


public Astro(int p){
x=p;
y=p;
x1=p-20;
y1=p-20;
}




public void compari(int q){
bers=q;
if(bers==1){
xorso=80;
yorso=250;

}
if(bers==2){
xorso=180;
yorso=260;

}
if(bers==3){
xorso=300;
yorso=230;

}
if(bers==4){
xorso=230;
yorso=400;

}
if(bers==5){
xorso=350;
yorso=360;

}
if(bers==6){
xorso=280;
yorso=320;

}
if(bers==7){
xorso=50;
yorso=400;

}

cartuccie=1;
colpito=0;

}

public void spara(){
if(cartuccie==1){
if((x+10 >= xorso)&(x+10 <= xorso+50)){
if((y+10 >= yorso)&(y+10 <= yorso+45)){
colpito=1;
cartuccie=0;
volte=volte+1;
}
}
}

}

public void passacordx(int x2){
xmir=x2;

} // Procedure che prendono coordinate dal main del MuoseMoved
public void passacordy(int y2){
ymir=y2;
}


public void spostadestra(){
x=x+10;

}
public void spostasinistra(){
x=x-10;
}
public void spostagiu(){
y=y+10;
}
public void spostasu(){
y=y-10;
}
public void ridisegna(){
repaint();
}
public void paint(Graphics g)
{

int grandezza=20;
Graphics2D g2=(Graphics2D) g;
Dimension dim_buffer = getSize();
//bv= createImage(dim_buffer.width, dim_buffer.height);
bv= createImage(500,500);
of=bv.getGraphics();
Graphics2D off=(Graphics2D) of;
off.setStroke(new BasicStroke(2));
Font fo=new Font("Arial", Font.BOLD,15);
off.setPaint(new GradientPaint(0,0,Color.BLACK,500,500,Color.MAGENT A));
//ImageIcon ico=new ImageIcon ("spazio1.jpg");
//Image astronave = ico.getImage();
//off.drawImage(astronave,0,0,500,500,this);
//Button b1=new Button("Chiudi");
off.setFont(fo);
off.drawString("Hai colpito pippo "+ volte+" volte!!!",5,450);

if(colpito==0){
off.setColor(Color.RED);
}
else{
off.setColor(Color.GREEN);

}
off.fillRect(xorso, yorso, 50, 45);


off.setColor(Color.YELLOW);
off.fillRect(0, 100, 500, 10);
//off.drawOval(x, y, 20,20);
off.drawLine(xmir, ymir-10, xmir, ymir+10); // Mirino da fare muovere con il muose
off.drawLine(xmir-10, ymir, xmir+10, ymir);


g2.drawImage(bv,0,0,this);
off.dispose();
}

/** Creates a new instance of Astro */
public Astro() {
}

public void update(Graphics g){
paint(g);


}

}


Questo tutto il programma... spero che qualcuno mi possa dare una mano..


Grazie

Virtual147
19-01-2006, 11:18
Vi Prego aiutatemi!! :cry:

Mi basta anche 1 piccolo aiuto!!

unomichisiada
19-01-2006, 12:04
Originariamente inviato da Virtual147
Vi Prego aiutatemi!! :cry:

Mi basta anche 1 piccolo aiuto!!
La classe ChiudiFinestra dov'? Non riesco a compilare perch manca quella.
PS. Tieni presente che tutti abbiamo altr cose da fare e il forum solo un hobby, quindi un po di pazienza...

LeleFT
19-01-2006, 13:56
Prova a guardare questa discussione, alla quale ho risposto tempo fa postando proprio una classe che fa al caso tuo...

http://forum.html.it/forum/showthread.php?s=&threadid=930015


Ciao. :ciauz:

Virtual147
19-01-2006, 13:58
Si scusa hai perfettamente ragione pretendo un po' troppo che da 1 po' che mi scervello x farla andare e ho guardato anche in giro x trovare 1 soluzione e prorio nn ce la faccio l'immagine rimane ferma alle coordinate 0,0... :)

Ora aggiungo di seguito anche la classe chiudifinestra...


package javaapplication4;
import java.awt.event.*;


/**
*
* @author 15345
*/
public class ChiudiFinestra implements WindowListener{
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowClosing(WindowEvent e)
{ System.exit(0);}
public void windowClosed(WindowEvent e){}
public void windowIconified (WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowOpened(WindowEvent e){}

}

Grazie unomichisiada della pasienza :)

unomichisiada
19-01-2006, 20:54
Controlla anche il suggerimento di LeleFT, non ti aiuta quello?

unomichisiada
19-01-2006, 23:18
Ho provato la tua classe devo dire che non ci ho capito nulla, nel senso che non ho capito comesi dovrebebro comportare i vari oggetti? Il quadratino si deve muovere per trascinamento, cio lo prendi e lo trascini e poi rilasci il mouse e quello si sposta li o cosa? E poi quando ci clki sopra cosa deve succedere? Vedo un metodo spara :master: .insomma speiga bene il comportamento che vuoi ottenere

Virtual147
20-01-2006, 07:28
Si in effetti se commentavo 1 po' era meglio.. in pratica il quadrato si muove da solo x effetto di un random.. quello che dovrebbe muoversi cn il muose sono due linee messe a forma di + che dovrebbero seguire la posizione del mouse.. diventare una sorta di puntatore.. Ora comunque sotto ho semplificato tutto x rendere spero pi chiaro il problema..

Grazie della tua disponibilit..

Ps. Veramente in quella discussione che ha inviato LEFT non ho capito nulla.. sono alle prime armi con il java sto ancora imparando..








Questo il main:


package javaapplication4;
import java.awt.*;
import java.awt.event.*;
import java.util.LinkedList;
import javax.swing.*;
import java.awt.Event.*;


public class Main extends Frame implements ActionListener, KeyListener,
MouseListener, MouseMotionListener {
public static int pos=50;
Astro m1=new Astro(pos);



public Main() {

Panel comandi=new Panel();
pos=50;
setBackground(Color.BLUE);
setLayout(new BorderLayout());
setSize(500, 500);
setLocation(500,500);
add(m1,"Center");
addMouseMotionListener(this);
addMouseListener(this);
setVisible(true);

}

public static void main(String[] args) {
new Main();

}



public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}


public void mouseMoved(MouseEvent e){
int x2;
int y2;
x2=e.getX();
y2=e.getY();
m1.passacordx(x2);
m1.passacordy(y2);

}
public void mouseDragged(MouseEvent e){}


}




E questa la classe dove c' la Paint con il disegno...



package javaapplication4;
import java.awt.*;
import javax.swing.*;
import java.awt.Event.*;


public class Astro extends Canvas{
Astro mv;
int x;
int y;


int xmir;
int ymir;
Image bv;
Graphics of;


public Astro(int p){
x=p;
y=p;
}






public void passacordx(int x2){
xmir=x2;
}

public void passacordy(int y2){
ymir=y2;
}


public void ridisegna(){
repaint();
}
public void paint(Graphics g)
{

Graphics2D g2=(Graphics2D) g;
Dimension dim_buffer = getSize();
bv= createImage(500,500);
of=bv.getGraphics();
Graphics2D off=(Graphics2D) of;
off.setStroke(new BasicStroke(2));
Font fo=new Font("Arial", Font.BOLD,15);



off.setColor(Color.YELLOW);
off.drawLine(xmir, ymir-10, xmir, ymir+10);
off.drawLine(xmir-10, ymir, xmir+10, ymir);


g2.drawImage(bv,0,0,this);
off.dispose();
}

public Astro() {
}

public void update(Graphics g){
paint(g);


}

}



Grazie!!

Loading