我有一个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));
我是否需要 - 在流程中 - 包含文件的完整路径,或仅包含文件的名称?两个罐子都在同一个目录中!
答案 0 :(得分:2)
此消息表示您需要在FX线程中运行UI更新。为此,您只需将更新包装到Runnable
并安排执行:
Platform.runLater(new Runnable() {
public void run() {
data.cons.setText(newText);
}
});