使用消息重定向方法(Java)时出错
几个月前,我实现了一个GUI,其中包含一个方法,基本上将控制台输出消息传输到GUI中包含的文本区域。该方法在某些计算机上运行正常(换句话说,它将消息从控制台输出传输并打印到JTextArea outputText),但在其他计算机上无法执行(未打印任何内容)。下面是一些代码:使用消息重定向方法(Java)时出错,java,multithreading,Java,Multithreading,几个月前,我实现了一个GUI,其中包含一个方法,基本上将控制台输出消息传输到GUI中包含的文本区域。该方法在某些计算机上运行正常(换句话说,它将消息从控制台输出传输并打印到JTextArea outputText),但在其他计算机上无法执行(未打印任何内容)。下面是一些代码: private JTextArea outputText; private void redirectSystemStreams() { OutputStream out = new OutputStream()
private JTextArea outputText;
private void redirectSystemStreams() {
OutputStream out = new OutputStream() {
@Override
public void write(int b) throws IOException {
updateTextArea(String.valueOf((char) b));
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
updateTextArea(new String(b, off, len));
}
@Override
public void write(byte[] b) throws IOException {
write(b, 0, b.length);
}
};
System.setOut(new PrintStream(out, true));
System.setErr(new PrintStream(out, true));
}
private void updateTextArea(final String text) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
outputText.append(text);
}
});
}
我相信问题在于每台计算机上安装的java版本的不同,但我不知道如何通过代码解决这个问题
更新(27.08.14):添加了有关方法行为的附加说明
更新2(27.08.14):在对我的项目进行了一点分析之后,我发现问题的存在是因为线程执行错误(在某些计算机上工作方式不同,因为没有加载此线程使用的dll…)。线程代码如下所示:
public class MyThread implements Runnable {
private static final int sleepDelay = 100;
public MyThread() {}
@Override
public void run() {
try {
//do something...
while(true) {
Thread.sleep(MyThread.sleepDelay);
//do something...
}
} catch(Exception e) {
//do something...
}
}
}
重要的是要知道两个进程(redirectSystemStreams()
和上面的线程)不访问或共享相同的对象。
我已经做了一些关于线程的研究,但我仍然对如何解决这个问题感到困惑,基本上是因为,至少对我来说,
redirectSystemStreams()
不像MyThread
中的线程那样。。。它无法在其他人身上执行如果您真的希望我们帮助您,您应该首先帮助我们,并解释它以何种方式失败。例外情况?没有得到预期的输出(如果你,你期望什么,你得到什么)?好的,很抱歉。当我说它可以工作时,这意味着它可以在JTextArea中传输和打印输出消息。当它不起作用时,意味着在JTextArea中没有打印任何内容…寻求调试帮助的问题(“为什么此代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅。您确定在所有系统上都调用了redirectSystemStreams()
?您是否得到任何关于可能出错的提示—异常、日志消息等。?JVM版本在每个系统上是不同的还是相同的?在GUI构造方法中,redirectSystemStreams()只执行一次。在此之后,所有消息都应打印在JTextArea内。此外,没有抛出异常。PC上的Java版本代码有效:1.7.0_65 PC上的Java版本不起作用:1.7.0_60注意:在我的情况下,更新Java版本现在不应该是一个选项。。。