当前位置: 首页 > 知识库问答 >
问题:

JavaFX使用平台从另一个线程更新TextArea。朗奈特

孙辰阳
2023-03-14

我正在尝试使用平台更新TextArea。runLater来自另一个实现Runnable的类。我的所有GUI都在一个类中(我的文本区域就在这个类中),我正在创建一个新服务器线程,并在创建GUI时运行它。我正在尝试使用平台。稍后从服务器线程运行更新我的文本区域但是平台。runLater无法到达我的文本区。

public class SimulationWindow {
    public SimulationWindow instance() {
        return this;
    }
    public static void DisplaySimulationWindow() throws FileNotFoundException {
        Stage SimuStage = new Stage();
        SimuStage.initModality(Modality.APPLICATION_MODAL);
        SimuStage.setTitle("Simulation Window");
        Server myServer = new Server(instance());
        Thread serverThread = new Thread(myServer);
        serverThread.start();
        TextArea serverTextArea;
         .
         .
         .
}

public class Server implements Runnable {
    @Override
    public void run() {
        while(true){
            whileConnected();
        .
        .
    }
    private void whileConnected() throws IOException {

        sendMessage(message);

        do {
            try {
                message = (String) input.readObject();  
                showMessage(message);
                .
                .
                .
    }
   private void showMessage(String x) {
    Platform.runLater(() -> serverTextArea.appendText(x));          
   }

我尝试将我的SimulationWindow实例传递给服务器构造函数,就像他们在这里做的那样:在不同的类中从不同的线程修改JavaFX gui

但是Java不会让我的SimulationWindow实例作为服务器构造函数的参数传递。其他解决方案将hold Server和SimulationWindow类作为一个类,但我想将它们分开。任何提示都将不胜感激!


共有1个答案

那利
2023-03-14

我解决了这个作为kleopatra建议。我传递了一个文本区域到我的服务器构造函数。我想从我的GUI类更新我的GUI中的文本区域,当从服务器类中的客户端获取消息时。(我创建并启动我的服务器在SimuWindow())

public class myGUI{
    public void SimuWindow(){
        //this method creates all the GUI.
        Server myServer = new Server(serverTextArea);
        Thread serverThread = new Thread(myServer);
        serverThread.start();

        sendingTest = new TextField();
        sendingTest.setPromptText("test communication here");
        sendingTest.setOnAction(event -> {
        String message = new String ("\nServer says: ");
        message = message + sendingTest.getText();
        serverTextArea.appendText(message);
        myServer.sendMessage(message);
        sendingTest.clear();
    });
    }
}

public class Server implements Runnable{
    //This is my server class that connects and listens to clients
    TextArea mytextArea;
    public Server(TextArea x) {
        this.mytextArea = x;
    }
    private void whileConnected() throws IOException {          
    do {
        try {
            message = (String) input.readObject();  
            showMessage(message);               
        }catch(ClassNotFoundException classNotFoundException) {
            System.out.println("\n i dont know the message");
        }
    }while(!message.equals("Disconnected"));    

    private void showMessage(String mess) {
            Platform.runLater(() -> mytextArea.appendText(mess));           
    }
}

我在我的客户课上也这么做了。谢谢你的帮助。

 类似资料:
  • 问题内容: 我有一个javafx应用程序和一个工作线程,通过来实现,它执行一个漫长的过程,即压缩并上传一组文件。 我已通过将任务进度连接到进度条。 除此之外,我想将有关正在处理的项目的详细状态报告到ui中。 也就是说,正在处理的文件的名称及其大小以及单个文件处理可能引起的任何错误。 用这些信息更新UI不能从工作线程中完成,最多我可以将其添加到同步集合中。 但是然后我需要一些事件来通知UI新数据可用

  • 我有一个javafx应用程序和一个通过实现的工作线程,它执行一个很长的过程,即压缩和上载一组文件。 我已通过将任务进度连接到进度条。 除此之外,我还希望将正在处理的项的详细状态报告到UI中。即正在处理的文件的名称及其大小和单个文件进程可能产生的任何错误。 不能从辅助线程中使用这些信息更新UI,最多只能将其添加到同步集合中。 但我需要一些事件来通知UI新数据可用。 javafx是否对此问题有特定的支

  • 所以我在这个问题上有点卡住了。我有一个非常基本的游戏,你用箭头键在网格周围移动一艘船。 我添加了另一个线程与一些怪物,应该自动漫游网格。我可以从打印语句中看到线程正在运行怪物正在移动,但是,图像位置没有更新。 我发现了一些类似的问题,有很多建议可以使用。但我不确定它是否符合我的具体情况,如果符合,如何实施。 下面是怪物类正在做的事情,每秒将怪物向右移动一个空间。就像我提到的,每次调用时,我都会记录

  • 问题内容: 亲爱的大家,我遇到了挥杆相关的问题。由于违反公司政策,我无法共享代码,因此我将尽力解释该问题。 简而言之,我创建了一个扩展包含JLabel的JWindow的类。JLabel的文本是通过计时器对象随机更新的,该计时器对象使用scheduleAtFixedRate方法每50毫秒实例化一个TimerTask。JLabel中的值是通过在一个单独的线程(称为传输线程)中调用一个方法来检索的,该线

  • 问题内容: 在我的Java应用程序中,当调用主模块时,我在单独的线程中启动SWT GUI。我需要在主线程中执行一些长时间的操作并更新GUI线程。当我尝试从主线程更新GUI线程(即更改标签文本等)时,出现了。根据我在线阅读的内容,因为SWT不允许非UI线程更新UI对象。如何从主线程更新GUI线程。 我在网上找到了一些示例,但是它们都处理了GUI在主线程中运行并且长时间操作在单独的线程中的情况。我的情

  • 问题内容: 我想更改Android中的UI。 我的主类创建第二个类,然后第二个类调用主类的方法。主类中的方法应更新UI,但程序在运行时会崩溃。 我该怎么办? 我的主要班级: 还有我的第二堂课: 问题答案: 您不能从主线程以外的线程调用UI方法。您应该使用Activity#runOnUiThread()方法。