1

私は別のクラスから、つまり実行することによってJavaFXGUIアプリケーションを開始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(これはクラスを拡張することに注意してください)です。TaskThread

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 に答える