JavaFX - 将ErrorStream转换为Label

时间:2013-12-01 07:44:21

标签: java multithreading user-interface javafx redirect

我有一个BufferedReader,从另一个Jarfile读取输入(错误)流。我在另一个线程中运行另一个jar文件,然后我创建一个循环读取行,然后重置标签文本。但它没有重新粉刷。我已经读过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。它与我分配的ram数量或CPU功率无关。我有8GB的ram,我在JavaFX程序和服务器上分配了两个。(无论如何它都是一个Minecraft服务器)。 CPU为i5-3570K。这很奇怪,因为这个程序是我之前使用JFrame构建的翻版。一切顺利!请帮我! (GUI上出现的行是第一行,不管它是什么。如果我在循环之前添加另一个setText(),只会出现。)

我收到此错误:

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

--------------- UPDATE -------------------- 我现在使用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));

我是否需要 - 在流程中 - 包含文件的完整路径,或仅包含文件的名称?两个罐子都在同一个目录中!

1 个答案:

答案 0 :(得分:2)

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

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