JeuWeb - Crée ton jeu par navigateur
Temps Reel Java - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Temps Reel Java (/showthread.php?tid=5968)

Pages : 1 2 3 4


RE: Temps Reel Java - Aleskweb - 17-02-2012

Hum dernière petite question :
 import java.io.PrintWriter;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;

public class Map extends Parent{


private int xx;
private int yy;
private int startx;
private int starty;
private int cl_mx;
private int cl_my;
private double mouseX;
private double mouseY;
private int caseX;
private int caseY;
private int currenty;
private int currentx;
private int idc =0;
private int clic =0;
private int startxm;
private int startym;
public Group[] tabtiles = new Group[200];
public Group[] tabtilesnew = new Group[200];
private Group partMap = new Group();
private Group til = new Group();
private PrintWriter _out;
private ImageView tile;



public Map(int id, int mx, int my, PrintWriter out){

startx = mx;
starty = my;
startxm = mx;

startym = my;
xx = startx;
yy = starty;
currentx = 0;
currenty = 0;
_out = out;
while (currenty<13){
while (currentx<13){

tabtiles[idc] = new Group();
tile = new ImageView(new Image(Tile.class.getResourceAsStream("img/t1.png")));
tabtiles[idc].getChildren().add(tile);
tabtiles[idc].setTranslateX(xx);
tabtiles[idc].setTranslateY(yy);
partMap.getChildren().add(tabtiles[idc]);
xx +=34;
yy += 17;
currentx++;
idc++;

}

currenty++;
xx = startx -currenty*34;
yy = starty + currenty*17;

currentx=0;
}

this.getChildren().add(partMap);
}



public void setx(int x)
{
partMap.setTranslateX(x);
startxm++;
}

public void setCase(int c)
{
tile = new ImageView(new Image(Tile.class.getResourceAsStream("img/t1.png")));
tabtiles[c].getChildren().add(tile);
}


}

Le code ci-dessus ne fonctionne pas, le problème vient du tabtiles[c].getChildren().add(tile); apperement, je peu bouger les groupes comme je le veux, mais quand j'essaie de modifier son contenu avec getChildren().add() voici l'erreur

Code :
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
    at javafx.scene.Parent$1.onProposedChange(Unknown Source)
    at com.sun.javafx.collections.VetoableObservableList.add(Unknown Source)
    at com.sun.javafx.collections.ObservableListWrapper.add(Unknown Source)
    at tkweb.Map.setCase(Map.java:108)
    at tkweb.Rendu$1.actionPerformed(Rendu.java:54)
    at javax.swing.Timer.fireActionPerformed(Timer.java:291)
    at javax.swing.Timer$DoPostEvent.run(Timer.java:221)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
    at java.awt.EventQueue.access$000(EventQueue.java:84)
    at java.awt.EventQueue$1.run(EventQueue.java:602)
    at java.awt.EventQueue$1.run(EventQueue.java:600)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
BUILD STOPPED (total time: 7 seconds)



RE: Temps Reel Java - Maks - 17-02-2012

Tu es sûr que le reste fonctionne ?
Ton paramètre formel c dans setCase() ne dépasse pas 200 ?
Dans ton constructeur : "this.getChildren().add(partMap);", this fait référence à quel contexte ?

Au niveau des API j'ai regardé ça m'a l'air correct.
Sinon pense à initialiser les attributs dans le constructeur plutôt qu'à la volée Wink


RE: Temps Reel Java - Aleskweb - 17-02-2012

Meme en fixant tabtiles[2].getChildren().add(tile); celui ci ne fonctionne pas.
En revanche, si je le met dans le constructeur "public Map(int id, int mx, int my, PrintWriter out)" juste après la génération de la map, cela fonctionne, c'est a rien n'y comprendre.
Aussi, je peu très bien modifier la position de tabtiles[x], et cela marche très bien, il n'y a que le getChildren().add qui blocke

Le "this" fait référence a l'objet en lui même, je l’appelle depuis une autre classe :" nmap = new Map(1,410,100,out);" et je l'affiche "Ecran.getChildren().add(nmap);"

Et pour ce qui est de l’initialisation des attributs, ce que tu veux dire c'est que j'initialise les variables hors du constructeur (du genre "Group monGroup;" et que je les définisses dans le constructeur "monGroup = new Group();" ?



RE: Temps Reel Java - Maks - 17-02-2012

Ton problème pour tabtiles[], je crois comprendre. Dans ton constructeur et dans setX() tu appliques les méthodes getChildren() et add() à une variable objet de type Group : partMap. Or dans setCase(), tu appliques ces méthodes à un tableau Group[] qui ne possèdent pas nécessairement ces méthodes ?
Essaye de faire un typeof et instanceof de tabtiles[c]

Oui voilà, en théorie on initialise tout dans le constructeur et aussi tous les attributs doivent être en privé (ou protected) ^^


RE: Temps Reel Java - Aleskweb - 17-02-2012

Merci
Le typeof donne : javafx.scene.Group
A quoi dois-je comparer le instanceof?


RE: Temps Reel Java - Maks - 17-02-2012

A Group mais le typeof ne laisse pas d’ambiguïté visiblement.
Ton paramètre c n'est pas hors champ ? (+200) ou indéfini ? Si tu l'affiches ça donne quoi ?

T'as essayé de passer tabtiles en private ?
Ton setCase() tu l’appellerais pas depuis un event par hasard ?

Car le message c'est "je suis dans le thread de l'event (la queue) et non dans celui de javafx" si je comprends bien.

Fais voir comment tu appelles ça Smile


RE: Temps Reel Java - Myrina - 17-02-2012

A tout hasard, mets un point d'arrêt dans le constructeur et lance l'application eb debug pour voir quel thread se trouve intercepter par le point d'arrêt; si ça se trouve, ce thread diffère de AWT-EventQueue-0 qui est celui qui utilise ton timer.


RE: Temps Reel Java - Maks - 17-02-2012

Si c'est un problème de Thread comme je le pense, ça pourrait être du à l'EDT : http://en.wikipedia.org/wiki/Event_dispatching_thread
Pour y executer du code asynchrone : http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingUtilities.html#invokeLater%28java.lang.Runnable%29


RE: Temps Reel Java - Aleskweb - 17-02-2012

Mon paramètre c je même en le fixant a 2 ça me met l'erreur, alors que comme je l'ai dit, quand je met la même ligne direct après la création de la map (dans le constructeur) ca marche nickel.
Donc en fait j'ai l'impression que dès que je sort du constructeur que j'ai appelé ( nmap = new Map(1,410,100,out); ) Il est impossible de modifier les Group.
Et encore ce n'est pas totalement le cas, j'ai fait un test et j'ai rajouté ceci :

Code :
public void affm()
       {
        
           this.getChildren().add(partMap);
           tile = new ImageView(new Image(Tile.class.getResourceAsStream("img/t2.png")));
           tabtiles[2].getChildren().add(tile);
       }
et j'ai remplacé le "this.getChildren().add(partmap) par affm();

Et la, ça fonctionne. Je comprends vraiment pas.

Edit:
Oui j'apelle depuis un event :

Code :
public class Rendu extends Parent{
    

    int x = 0;
    Group Ecran = new Group();
    Map nmap;
    private Connexion Connect;
    private BufferedReader in;
    private PrintWriter out;
    private String msg=null;
    
    public Rendu()
    {
       Connect = new Connexion();
       out = Connect.getOut();
       nmap = new Map(1,410,100,out);
       Ecran.getChildren().add(nmap);
       this.getChildren().add(Ecran);
       new Timer(33,taskPerformer).start();
      
      
    }
    
    ActionListener taskPerformer = new ActionListener() {
        @Override
      public void actionPerformed(ActionEvent evt) {
         msg = Connect.getMsg();
          
         if(msg != null && !"".equals(msg))
                 {
                    System.out.println("Rc: "+msg);
                     String str[]=msg.split("/");
                     System.out.println("str:"+str[0]);
                     if(str[0].equals("1"))
                     {
                        
                     //nmap.setCase(Integer.parseInt(str[1]));
                     nmap.setCase(2);
                
                  
                     }
                 }
        
            
      }  
  };
}

Bon en gros, c'est quand je recoit de mon serveur un message de la forme "1/x" avec x numéro de l'image sa m'affiche l'image;


Oula euu je vais voir ce que vous m'avez envoyé après le repas.
Merci


RE: Temps Reel Java - Aleskweb - 17-02-2012

Donc quelqu’un a compris le problème? J'apelle une classe JavaFx depuis Awt? C'est ca? Dans ce cas la si j'utilise un Timer issu de java.util.timer, ca devrais regler le problème?