2013-02-22 77 views
1

我从另一个类启动一个JavaFX GUI应用程序,即通过这样做的StartClientJavaFX访问gui按钮从另一个线程动作

public class StartClient extends Application { 

private Table gui; 

@Override 
public void start(Stage stage) throws Exception { 
    gui = new Table(); 
    gui.start(stage); 

我开始通过该予连接到服务器和接收服务器,这是我使用Platform.runLater在GUI设置分配匝一个Task

Task<Void> task = new Task<Void>() { 
    @Override 
    protected Void call() throws Exception { 
     connectToServer(); // connect to server, set up socket, i/o streams 
     Object read = inputStream.readObject(); 

     if (read instanceof String) { 
      turn = //parseInt from read 
      Platform.runLater(new Runnable() { 
       public void run() { 
        gui.setPlayerID(turn); 
       } 
      }); 
     } 
    } 
}; //end of task 

我的问题是什么,我想由玩家做出的举动,如果轮到他们,并将其发送回服务器做这样的事情:

if(networkClientID == gui.getState().getTurn()){ 
    do { 
     action = Table.getAction(); //static getAction returns the move from the table if there was one 
    } while (action == -1); 

    outputStream.writeObject(action + ""); // write out turn 
} 

办这个后台Thread(我从GUI读取静态变量或我应该这样做在JavaFX线程即内Platform.runLater,我都尝试过,但没有得到任何地方,我的程序卡住。)

任何建议, H埃尔普,建议欢迎如何解决这个问题。谢谢!

回答

1

恕我直言,最好的办法是让你的数据(即:转)在一个单独的类。

记住JavaFX是一个MVC模型。你可以使用一个Model类来保存这些信息并引用它。如果您将模型类的引用传递给另一个线程,则必须将其同步到另一个线程。

这样你就可以保持独立。你的控制器只会控制场景在做什么。你的模型将存储信息。

This answer给出了一个很好的起点,说明如何实现这一点。

例如我有一个任务(文件观察者),我打电话它如下所示。这里是我的控制器的快照:

public class myController { 
    private Context context; 
    private Executor executor; 

    ... 

    myBtn.setOnAction(new EventHandler<ActionEvent>() { 
     public void handle(ActionEvent event) { 
      task = new ResultFileWatcher(context); //context is my singleton model class 
      executor.execute(task); 
     } 
    } 

    ... 

} 

和我的类,它扩展类看起来有点像这样。这里是我的Task(注意这延伸了类Task),它将运行在不同的Thread

public class ResultFileWatcher extends Task<Object> { 
    private Context context; 

    public ResultFileWatcher(Context context) { 
     this.context = context; 
    } 

    ... 

    @Override 
    protected Object call() throws Exception { 
     //... 
    } 
} 

希望这会有所帮助!

+0

非常感谢您的回复。我会给这个镜头。 @ blo0p3r – 2013-02-22 21:03:28

+0

即使我没有FXML,我也可以实现MVC模型吗?我只是通过扩展Application来创建JavaFX gui。 – 2013-02-22 21:09:34

+0

是ResultFileWatcher控制器吗?我有点困惑。或者它仅仅是倾听变化的任务。 – 2013-02-22 21:11:28