[英]JavaFx and socket listener
我們正在開發一個必須同時使用GUI和CLI的客戶端服務器應用程序。 CLI沒問題,但是我們努力用JavaFX來實現它:
我們的服務器(通過套接字)向客戶端發送一些對象,這些對象必須進行處理。
這是我們的SocketServerListener(和編寫器):
public class SockeServerListener extends Thread implements ServerListener{
private CliController controller;
private ObjectInputStream in;
private ObjectOutputStream out;
public SocketServerListener(Socket server, CliController controller) throws UnknownHostException, IOException {
this.controller = controller;
this.out = new ObjectOutputStream(server.getOutputStream());
this.in = new ObjectInputStream(server.getInputStream());
}
public void publishMessage(String message) throws IOException, RemoteException {
out.writeObject(message);
out.flush();
}
public void run() {
try {
while (true) {
Dialogue dialogue = (Dialogue) in.readObject();
controller.parseDialogue(dialogue);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
SocketServerListener由控制器實例化,該控制器是執行“執行”所接收對象,更新接口(Cli / GUI)的控制器。
public void parseDialogue(Dialogue dialog) {
dialog.execute(view); //view is an interface extended by both the Cli and GUI
this.canWrite = true;
}
就像我說的那樣,這在CLI上很好用,但是JavaFX引發了異常
Exception in thread "Thread-7" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-7
我們嘗試使用用於生成所有GUI的Class作為控制器,但是沒有任何(肯定的)結果。 我們如何實例化一個線程,使其可以與JavaFX一起使用,並調用顯示所需屏幕的方法?
謝謝
不在FX應用程序線程上
給您問題的原因。
根據Node類的Javadoc:
節點對象可以在任何線程上構造和修改,只要它們尚未附加到正在顯示的窗口中的場景上即可。 應用程序必須將節點附加到此類場景,或在JavaFX應用程序線程上對其進行修改。
使用Platform.runLater在FX應用程序線程上執行代碼,還可以查看javafx.concurrent包中的更多實用程序類。
大概是對controller.parseDialogue(dialogue);
的調用controller.parseDialogue(dialogue);
正在更新用戶界面。 您只能在FX Application Thread上執行此操作。 您可以使用Platform.runLater()
安排可運行的程序在FX Application線程上執行:
Platform.runLater( () -> controller.parseDialogue(dialogue) );
請注意,如果您不知道要在已啟動FX工具包的上下文中執行此代碼,則應改為在控制器中調用Platform.runLater(...)
,例如
public class NonGuiController implements CliController {
@Override
public void parseDialog(Dialogue dialogue) {
// regular code here...
}
}
和
public class GuiController implements CliController {
@Override
public void parseDialogue(Dialogue dialogue) {
// some preliminary work (still on background thread here) if necessary...
Platform.runLater(() -> {
// code that updates UI here...
});
}
}
並還原為套接字偵聽器類中的原始代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.