gpt4 book ai didi

JavaFX - ErrorStream 到标签中

转载 作者:行者123 更新时间:2023-11-30 04:07:53 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com