当我运行不同的线程javafx时,游戏冻结

当我运行不同的线程javafx时,游戏冻结,java,multithreading,javafx-2,freeze,Java,Multithreading,Javafx 2,Freeze,我对javaFX有一个问题: 当我运行新线程时,游戏将冻结加载,永远不会继续 这是游戏循环类: public class Motor implements Runnable{ private Mapa mapa; public Motor(Canvas canvas,Label label){ ArrayList<Nivel> lstNiveles = new ArrayList<Nivel>(); mapa=new Mapa(lstNiveles,ca

我对javaFX有一个问题: 当我运行新线程时,游戏将冻结加载,永远不会继续

这是游戏循环类:

public class Motor implements Runnable{
private Mapa mapa;

public Motor(Canvas canvas,Label label){
    ArrayList<Nivel> lstNiveles = new ArrayList<Nivel>();
    mapa=new Mapa(lstNiveles,canvas,label);
}

public void start(){
    System.out.println(Platform.isFxApplicationThread());
    Platform.runLater(this);
}   

public void run(){
    System.out.println(Platform.isFxApplicationThread());
    ArrayList<Nivel> lstNiveles = new ArrayList<Nivel>();
    mapa=new Mapa(lstNiveles,ControladorMapa.canvas,ControladorMapa.mapa);
    mapa.cargarMapa();
    while(true){
        try{
            mapa.rePaint();

            Thread.sleep(2000);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
}

您正在阻止
马达中的FX应用程序线程。运行

while (true) {
    try {
        mapa.rePaint();
        Thread.sleep(2000);
    } catch(Exception e){
        e.printStackTrace();
    }
}

我不知道你为什么需要这个循环,但通过FX应用程序线程运行它肯定是错误的。

这个循环使用内置的播放器更新地图,我不知道如何将它放在主线程或新线程中thread@user3624703正如我写的:我不知道这个循环是为了什么。为什么需要在循环中重新绘制任何内容?因为我必须在地图上移动玩家更新其位置并注意如果玩家在地图中达到某个级别如果玩家是JavaFX节点,则在重新定位时会自动重新绘制。
public class Mapa {

private PjAnimado pj;
private ArrayList<Nivel> lstNiveles;
private Label mapa;

public Mapa(ArrayList<Nivel> lstNiveles,Canvas canvas,Label mapa){
    this.setLstNiveles(lstNiveles);
    pj=new PjAnimado(100,100,canvas);
    this.mapa=mapa;
}

public void cargarMapa(){
    pj.paint();
    ponerFondo();

}
public void rePaint(){
    pj.paint();
}
private void ponerFondo(){
    mapa.setGraphic(new ImageView(new Image(getClass().getResource("../recursos/Desert.jpg").toExternalForm())));
}

public PjAnimado getPj() {
    return pj;
}

public void setPj(PjAnimado pj) {
    this.pj = pj;
}

public ArrayList<Nivel> getLstNiveles() {
    return lstNiveles;
}

public void setLstNiveles(ArrayList<Nivel> lstNiveles) {
    this.lstNiveles = lstNiveles;
}
}
public class ControladorMapa implements Initializable,EventHandler<KeyEvent>{

@FXML StackPane logo1;
@FXML public static AnchorPane contPrincipal;
@FXML public static Label mapa;
@FXML public static Canvas canvas;

public void initialize(URL arg0, ResourceBundle arg1) { 
}
public class test extends Application {

@Override
public void start(Stage escenario) throws Exception {
    Parent root= FXMLLoader.load(getClass().getResource("Mapa.fxml"));
    Scene scene = new Scene(root);
    escenario.setScene(scene);
    escenario.show();
    Motor motor = new Motor(ControladorMapa.canvas,ControladorMapa.mapa);
    motor.start();
}
public static void main(String[] args) {
    launch(args);
}


}
while (true) {
    try {
        mapa.rePaint();
        Thread.sleep(2000);
    } catch(Exception e){
        e.printStackTrace();
    }
}