1

我正在从另一个类开始一个 JavaFX gui 应用程序,即StartClient通过做。

public class StartClient extends Application {

private Table gui;

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

Task通过它连接到服务器并接收服务器分配的轮次,我在 gui 中使用Platform.runLater.

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,我已经尝试过,但没有得到任何地方,我的程序卡住了。)

任何建议,帮助,欢迎就如何解决这个问题提出建议。谢谢!

4

1 回答 1

1

恕我直言,最好的方法是将您的数据(即:转弯)放在一个单独的类中。

请记住 JavaFX 是一种 MVC 模型。您可以使用 Model 类来保留此信息并引用此信息。如果要将对模型类的引用传递给另一个线程,则必须同步该线程。

这样你就可以把事情分开。你的控制器只会控制场景在做什么。您的模型将存储信息。

这个答案为如何实现这一点提供了一个很好的起点。

例如,我有一个任务(文件观察者),我将其称为如下所示。这是我的控制器的快速快照:

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 {
        //...
    }
}

希望这可以帮助!

于 2013-02-22T19:57:01.223 回答