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 は既に見つかりましたが、どれをどのように使用する必要がありますか?
前もって感謝します!