Bonjour,
je reviens sur mon problème avec la classe java.awt.Robot. Etant donné que je n'ai eu aucune réponse, je met tout mon code en espérant que quelqu'un pourra trouver ce qui ne va pas parce que ça fait plus d'une semaine que je n'y arrive pas.
Classe du thread
import java.awt.Robot;
/**
* thread pour la construction d'une parallèle
* @author au
*
*/
public class FirstThread extends Thread {
PanelParallèle p;
boolean actif;
public FirstThread(PanelParallèle p) {
this.p =p;
this.actif=false;
}
public void run() {
actif=true;
while(actif==true){
try{
Robot r= new Robot();
for (int i = 0; i < 300; i++)
{
for (int j = 0; j < 300; j++)
{
if ((j - (p.coefDir2 * i) - (p.absOr2)) < 0.5f && (j - (p.coefDir2 * i) - (p.absOr2)) > -0.5f){
r.mouseMove((int)(i+p.getLocationOnScreen().getX()),(int)(j+p.getLocationOnScreen().getY()));}
}
}
}
catch(Exception ex){
System.out.println("Exception :"+ex.getMessage());
}
}
}
public void setActif(boolean a){
actif=a;
}
}
Classe qui définit un point
import java.awt.*;
/**
* Classe définissant un point et les opérations effectuées sur un point
*
*/
public class MonPoint extends Geometrie {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* <p>Abscisse du point</p>
*
*/
public int x;
/**
* <p>Ordonnée du point</p>
*
*/
public int y;
/**
* Construit et initialise un point aux coordonnées a, o
* @param a abscisse du point
* @param o ordonnée du point
*/
public MonPoint(int a, int o){
this.x=a;
this.y=o;
}
/**
* Définit l'abscisse d'un point
* @param a abscisse du point
*/
public void setX(int a) {
this.x=a;
}
/**
* Définit l'ordonnée d'un point
* @param o ordonnée du point
*/
public void setY(int o) {
this.y=o;
}
/**
* Retourne l'abscisse du point
* @return abscisse du point
*/
public int getX() {
// your code here
return this.x;
}
/**
*Retourne l'ordonnée du point
* @return ordonnée du point
*/
public int getY() {
// your code here
return this.y;
}
/**
* Calcule la distance entre le point et un autre point
*
* @return distance entre les deux points
*/
public int distance(MonPoint p) {
int dx = p.x - x ;
int dy = p.y - y ;
int res= dx*dx + dy*dy;
return res ;
}
/**
* effectue la rotation d'un point
* @param a angle de rotation
*/
public void rotation (double a)
{
}
public void affiche(Graphics g) {
// TODO Auto-generated method stub
Graphics2D g2 = (Graphics2D) g;
if (selected)
g2.setColor(Color.blue);
else
g2.setColor(Color.black);
g2.drawRect(x,y,1,1);
}
public boolean contains(int x, int y) {
return ((this.x==x) && (this.y==y));
}
public int nbPoints() {
return 1;
}
@Override
public String typeGeom() {
return "point";
}
}
Classe qui définit une ligne
import java.awt.*;
/**
*
*
*/
public class Ligne extends Geometrie {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* <p>Tableau représentant tous les points de la ligne</p>
*
*/
public MonPoint[] points;
int size;
/**
*
*
*/
public Ligne(){
this.points=null;
this.size=0;
}
/**
* construit une ligne vide de taille s
* @param s
*/
public Ligne(int s){
this.points=null;
this.size=s;
}
/**
* construit une ligne et l'initialise avec les points contenus dans p
* @param p tableau contenant les points de la ligne
*/
public Ligne(MonPoint p[]){
this.points=p;
this.size=p.length;
}
/**
* initialise les points de la ligne
*
*/
public void setPoints(MonPoint p[]) {
this.points=p;
}
/**
* retourne les points de la ligne
*
* @return points constituant la ligne
*/
public MonPoint[] getPoints() {
// your code here
return points;
}
/**
* renvoie le nombre de points de la ligne
*
* @return nombre de points de la ligne
*/
public int nbPoints() {
// your code here
return this.points.length;
}
/**
* retourne le premier point de la ligne
*
* @return premier point de la ligne
*/
public MonPoint getPointDeb() {
return this.points[0];
}
/**
* initilaise le point de début de la ligne à p
* @param p point de début
*/
public void setPointDeb(MonPoint p){
this.points[0]=p;
}
/**
* retourne le dernier point de la ligne
*
* @return dernier point de la ligne
*/
public MonPoint getPointFin() {
return this.points[nbPoints()-1];
}
/**
* initilaise le point de fin de la ligne à p
* @param p point de fin
*/
public void setPointFin(MonPoint p){
this.points[nbPoints()-1]= p;
}
/**
* donne l'image de la ligne par rapport au point o avec un angle a
* @param o point de référence pour la rotation
* @param a angle de rotation
*/
public void rotation(double a) {
// your code here
}
public void affiche(Graphics g) {
// TODO Auto-generated method stub
Graphics2D g2 = (Graphics2D) g;
int[] abscisse = new int[this.points.length];
int[] ordonnee = new int[this.points.length];
// stock abscisses et ordonnées des sommets du polygone dans un tableau.
for (int i=0 ; i < this.points.length ; i++) {
abscisse[i] = this.points[i].getX();
ordonnee[i] = this.points[i].getY();
}
if (selected)
g2.setColor(Color.blue);
else
g2.setColor(Color.black);
for (int i=0; i<this.points.length-1; i++){
this.points[i].affiche(g2);
}
g2.drawPolyline(abscisse,ordonnee,abscisse.length);
}
public boolean contains(int x, int y) {
boolean verif = false;
return verif;
}
public String typeGeom() {
// TODO Auto-generated method stub
return "ligne";
}
}
Classe geometrie
import java.awt.Graphics;
import java.io.Serializable;
public abstract class Geometrie implements Serializable{
public boolean selected = false;
public abstract void affiche(Graphics g) ;
public abstract void rotation(double a);
public abstract boolean contains (int x, int y);
public abstract int nbPoints();
public abstract String typeGeom();
}
Classe qui permet de dessiner
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class Parallèle extends JFrame
{
private static final long serialVersionUID = 1L;
PanelParallèle panel = new PanelParallèle();
public static void main (String[] args)
{
Parallèle para = new Parallèle();
para.setVisible(true);
}
public Parallèle()
{
Dimension taille_ecran = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
int hauteur_ecran = (int)taille_ecran.getHeight();
int largeur_ecran = (int)taille_ecran.getWidth();
setTitle("Parallèle");
setLocation((largeur_ecran / 2) - (175), (hauteur_ecran / 2) - (200));
setSize(350, 400);
setLayout(null);
panel.setBounds(20, 20, 300, 300);
add(panel);
panel.setBackground(Color.white);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
class PanelParallèle extends JPanel implements MouseListener
{
private static final long serialVersionUID = 1L;
MonPoint p1, p2,p3,p4,p5;
float coefDir1 = 0f;
float absOr1 = 0f;
public float coefDir2 = 0f;
public float absOr2 = 0f;
String eqDroite1 = "";
String eqDroite2 = "";
int etape = 0;
int x,y;
String message = "";
Parallèle par;
ArrayList <Geometrie> forme = new ArrayList <Geometrie>();
ArrayList <MonPoint> li2 = new ArrayList <MonPoint>();
ArrayList <MonPoint> li = new ArrayList <MonPoint>();
FirstThread thr1;
public PanelParallèle()
{
setBackground(Color.white);
addMouseListener(this);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
for (int i = 0; i < forme.size(); i++)
{
if (forme.get(i) instanceof Geometrie)
{
Geometrie geom= (Geometrie) forme.get(i);
geom.affiche(g);
}
}
g.setColor(new Color(0, 0, 0));
}
public String CalculEqDroite1(MonPoint p, MonPoint pp)
{
System.out.println("1er point :" +p.x+ " "+p.y);
System.out.println("2ème point :" +pp.x+ " "+pp.y);
coefDir1 = (float) ((float) (pp.y - p.y)) / ((float) (pp.x - p.x));
absOr1 = (float) (p.y - (p.x * coefDir1)) ;
return ("y = " + coefDir1 + "x + " + absOr1);
}
public String CalculEqDroite2()
{
coefDir2 = coefDir1;
absOr2 = (float) (p3.y - (p3.x * coefDir2));
return ("y = " + coefDir2 + "x + " + absOr2);
}
public void mouseClicked(MouseEvent e)
{
Graphics g = getGraphics();
System.out.println("dans cas 1");
if (etape == 0)
{
System.out.println("dans 1ère étape");
p1= new MonPoint(e.getX(),e.getY());
p1.affiche(g);
li2.add(p1);
forme.add(p1);
}
if (etape == 1)
{
System.out.println("dans 2ème étape");
p2 = new MonPoint( e.getX(),e.getY());
p2.affiche(g);
li2.add(p2);
forme.add(p2);
}
if (etape == 2)
{
System.out.println("dans 3ème étape");
Ligne l1 = new Ligne(li2.size());
MonPoint[] tab = new MonPoint[li2.size()];
for (int i=0; i<li2.size(); i++){
tab[i]=li2.get(i);
l1.points=tab;
}
l1.affiche(g);
forme.add(l1);
eqDroite1 = CalculEqDroite1(p1,p2);
System.out.println(coefDir1);
}
if (etape == 3)
{
System.out.println("dans 4ème étape");
p3 = new MonPoint( e.getX(),e.getY());
p3.affiche(g);
li.add(p3);
forme.add(p3);
}
if (etape == 4)
{
System.out.println("dans 5ème étape");
eqDroite2 = CalculEqDroite2();
System.out.println(eqDroite2);
System.out.println(coefDir2);
System.out.println(absOr2);
}
if(etape==5){
System.out.println("dans 6ème étape");
thr1 = new FirstThread(this);
thr1.start();
thr1.setPriority(Thread.MIN_PRIORITY);
// System.out.println("fin thread");
}
if(etape==6){
System.out.println("dernière étape");
thr1.setActif(false);
System.out.println(thr1.actif);
thr1=null;
System.gc();
p4 = new MonPoint(e.getX(),e.getY());
System.out.println("p4 x" +p4.x);
System.out.println("p4 y" +p4.y);
p4.affiche(g);
li.add(p4);
forme.add(p4);
Ligne l2 = new Ligne(li.size());
MonPoint[] tab = new MonPoint[li.size()];
for (int k=0; k<li.size(); k++){
tab[k]=li.get(k);
l2.points=tab;
}
l2.affiche(g);
forme.add(l2);
}
etape++;
this.repaint();
}
public void mousePressed(MouseEvent e)
{
}
public void mouseReleased(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
public void mouseEntered(MouseEvent e)
{
}
}
Alors, les classes Ligne, MonPoint et Geometrie ne présentent aucun problème. Je oense que le problème doit se situer au niveau du code de mon thread ou dans la méthode mouseClicked() lorsque j'appelle le thread.
Le problème qui se pose est en fait qu'au clic après etape==5, je dois pouvoir créer mon point et arrêter le thread. Mais je n'y arrive pas, c'est après plusieurs tentatives de clics que j'arrive à créer le point et de ce fait, il n'est pas créé à l'endroit voulu parce que je ne sais pas exactement quand le clic est pris en compte.
J'explique vite fiat, une fois qu'on exécute Parallèle, il suffit juste de cliquer à chaque fois sur le panel, et à chaque clic, on passe à l'étape suivante.
Si jamais quelqu'un arrive à voir à quoi est dû mon problème, ça m'aiderait beaucoup.
Merci d'avance pour l'aide.
perluce
Bonjour,
je reviens sur mon problème avec la classe java.awt.Robot. Etant donné que je n'ai eu aucune réponse, je met tout mon code en espérant que quelqu'un pourra trouver ce qui ne va pas parce que ça fait plus d'une semaine que je n'y arrive pas.
Classe du thread
Classe qui définit un point
Classe qui définit une ligne
Classe geometrie
Classe qui permet de dessiner
Alors, les classes Ligne, MonPoint et Geometrie ne présentent aucun problème. Je oense que le problème doit se situer au niveau du code de mon thread ou dans la méthode mouseClicked() lorsque j'appelle le thread.
Le problème qui se pose est en fait qu'au clic après etape==5, je dois pouvoir créer mon point et arrêter le thread. Mais je n'y arrive pas, c'est après plusieurs tentatives de clics que j'arrive à créer le point et de ce fait, il n'est pas créé à l'endroit voulu parce que je ne sais pas exactement quand le clic est pris en compte.
J'explique vite fiat, une fois qu'on exécute Parallèle, il suffit juste de cliquer à chaque fois sur le panel, et à chaque clic, on passe à l'étape suivante.
Si jamais quelqu'un arrive à voir à quoi est dû mon problème, ça m'aiderait beaucoup.
Merci d'avance pour l'aide.
perluce