簡體   English   中英

JavaFx和套接字偵聽器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM