JavaFX - ErrorStream 到标签中

标签 java multithreading user-interface javafx redirect

我有一个 BufferedReader ,从另一个 Jarfile 读取输入(错误)流。我在另一个线程中运行另一个 jarfile,然后我循环读取行,然后重置标签文本。但它不会重新绘制。我读到 JavaFX 是单线程的。但我不知道该怎么办。这是代码:

Thread start = new Thread(){
            @Override
            public void run(){
        try{
            Process proc = Runtime.getRuntime().exec("javaw -Xmx2048M -jar craftbukkit.jar -o true --nojline");
            data.setInputStream(proc.getErrorStream());
            data.setOutputStream(proc.getOutputStream());
        }catch(IOException ex){
            ex.printStackTrace();
        }
        BufferedReader readr = new BufferedReader(new InputStreamReader(data.getInputStream()));
        data.setServerStarted(true);
        String line;
        while(data.serverStarted()){
            try {
                if((line = readr.readLine()) != null){
                    data.cons.setText(data.cons.getText() + line + "\n");//cons is the label
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                try {
                    readr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }}};
        start.start();

但是如果我尝试在同一线程中运行这个程序,程序将不会响应。我正在做一些标签重写,但是,它是在同一个线程中,然后,重写后立即进行。我从 jar 的输入流中得到一行。这是代码:

public void sendCommand(String command){
    if(data.serverStarted()){
    if (!(command.equalsIgnoreCase(""))){
    if(!(command.equalsIgnoreCase("stop"))){
        try {
            data.cons.setText(data.cons.getText() + ">" + command + "\n");
            data.bw.write(command);
            data.bw.newLine();
            data.bw.flush();
            data.tl.setText("Type your command here...");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }else{
        data.cons.setText(data.cons.getText() + "This command is not allowed!" + "\n");
    }
    }else{
        data.cons.setText(data.cons.getText() + "Please make sure that you have entered a command" + "\n");
    }
    }else{
        data.cons.setText(data.cons.getText() + "Please start your server first!" + "\n");
    }
}

如果我尝试发送命令,无论我在哪个阶段执行,如果我搞乱了 cons.setText(); ,它会给我这样的东西: http://prntscr.com/27w6yv ,而标准的 MS-DOS 启动将是这样的: http://prntscr.com/27w79v 。这与我分配的内存量或 CPU 功率无关。我有 8GB 内存,我在 JavaFX 程序和服务器上分配了 2GB。(无论如何,它是一个 Minecraft 服务器)。 CPU是i5-3570K。这很奇怪,因为这个程序是我以前的程序的翻版,用 JFrame 构建。那里一切都很顺利!请帮我! (出现在 GUI 上的行是第一行,不管它是什么。如果我在循环之前添加另一个 setText(),则只有它会出现。)

我收到此错误:

java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-6

---------------更新-------------------- 我现在使用 Platform.runLater();但我收到“系统找不到指定的文件错误”

产生错误的代码是:

BufferedReader readr = new BufferedReader(new InputStreamReader(is));

这是所需的所有代码:

try{
            data.updateConsole("Starting server!");
            Process proc = Runtime.getRuntime().exec("start javaw -Xmx2048M -jar craftbukkit.jar -o true --nojline");
            data.setOutputStream(proc.getOutputStream());
            is = proc.getErrorStream();
        }catch(IOException ex){
            ex.printStackTrace();
        }
        BufferedReader readr = new BufferedReader(new InputStreamReader(is));

我需要 - 在此过程中 - 包含文件的完整路径,还是仅包含文件的名称?两个 jar 都在同一目录中!

最佳答案

此消息意味着您需要在 FX 线程中运行 UI 更新。为此,您只需将更新包装到 Runnable 中并安排其执行:

Platform.runLater(new Runnable() {
    public void run() {
        data.cons.setText(newText);
    }
});

关于JavaFX - ErrorStream 到标签中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20309915/

相关文章:

c# - 我如何强制禁用元素的 wpf 窗口/控件刷新

vba - 用户窗体在 "End Sub"之后关闭,而无需调用 "Unload Me"

java - 使用 JPA 和/或 Hibernate 将 Java Web 应用程序连接到 MySQL?

java - 如何在终端中运行打包的java文件?

java - 使用 Hibernate 时数据库的成熟度有多重要

multithreading - 它有 crystal-lang 队列吗?

c# - 为什么额外的异步操作使我的代码比操作根本没有发生时更快?

java - 确保线程被中断

c# - 多线程场景调用Dictionary对象的set_item方法抛出NullReferenceException

javascript - jQuery 隐藏 div,显示包含新内容的 div