2

wifi(アンドロイド)経由で携帯電話と通信するJavaFXアプリケーションを実装しています。

したがって、バックグラウンド プロセスで実行されている JavaFX にサーバー スレッドがあります。

public class NetworkService implements Runnable { 

    private final ServerSocket serverSocket;
    private final ExecutorService pool;

    private RoutePlannerJFX application;
    private UserData userData;


    public NetworkService(ExecutorService pool,
                          ServerSocket serverSocket,
                          RoutePlannerJFX app,
                          UserData data) {
        this.serverSocket = serverSocket;
        this.pool = pool;
        application = app;
        userData = data;
    }


    public void run() {
        try {
            while ( true ) {
                Socket cs = serverSocket.accept(); 
                pool.execute(new Handler(serverSocket, cs, application, userData));
            }
        } catch (IOException ex) {
            System.out.println("--- Interrupt NetworkService-run");
        }
        finally {
            System.out.println("--- Ende NetworkService(pool.shutdown)");
            pool.shutdown();  //keine Annahme von neuen Anforderungen
            try {
                pool.awaitTermination(4L, TimeUnit.SECONDS);
                if ( !serverSocket.isClosed() ) {
                    System.out.println("--- Ende NetworkService:ServerSocket close");
                    serverSocket.close();
                }
            } catch ( IOException e ) { }
            catch ( InterruptedException ei ) { }
        }
    }
}

ハンドラーを持っています:

public class Handler implements Runnable {

    private final Socket client;
    private final ServerSocket serverSocket;

    private RoutePlannerJFX application;
    private UserData userData;


    Handler(ServerSocket serverSocket,Socket client, RoutePlannerJFX app, UserData data) {
        this.client = client;
        this.serverSocket = serverSocket;
        application = app;
        userData = data;
    }


    public void run() {
        StringBuffer sb = new StringBuffer();
        PrintWriter out = null;
        try {
            System.out.println( "running service, " + Thread.currentThread() );
            out = new PrintWriter( client.getOutputStream(), true );
            BufferedReader bufferedReader = 
                new BufferedReader(
                    new InputStreamReader(
                        client.getInputStream()));
            char[] buffer = new char[100];
            int anzahlZeichen = bufferedReader.read(buffer, 0, 100); 
            String nachricht = new String(buffer, 0, anzahlZeichen);
            String[] werte = nachricht.split("\\s");


            System.out.println(nachricht+"\n");

            POI poi = new POI(nachricht);
            userData.addItemToPoiList(poi);

            application.setScene("INSTRUCT");

        } catch (IOException e) {System.out.println("IOException, Handler-run");}
        finally { 
            System.out.println(sb);  //Rückgabe Ergebnis an den Client
            if ( !client.isClosed() ) {
            System.out.println("****** Handler:Client close");
            try {
                client.close();
                } catch ( IOException e ) { }
            } 
        }
    }
}

アプリケーションには、シーンを変更するパブリック メソッド (setScene()) があります。

それができればいいのですが、バックグラウンドプロセスでシーンを切り替えることができないことがわかりました。

この問題を実装する方法を知っている人はいますか? バックグラウンドプロセスがクライアントからメッセージを受信したときにアクションを起動する必要がありますが、それを実行する最善の方法がわかりません... javafx.concurrent は既に見つかりましたが、どれをどのように使用する必要がありますか?

前もって感謝します!

4

1 に答える 1

2

クライアント側では、ドキュメントに記載されているように、タスクまたはサービスを使用して別のスレッドで実行し、GUI を更新できます。

この投稿も確認できますJavaFX Async Task

于 2012-09-03T22:34:57.433 に答える