Я работаю над «консолью», использующей JTextArea, и все работает отлично, за исключением того, что вывод не работает так, как я хочу.
Я использую модифицированную версию классаЯ нашел здесь в Stackoverflow.
import java.io.*;
import javax.swing.*;
public class textareaStream extends OutputStream {
//*************************
//* Parameters
//*************************
private JTextArea textArea; // target text area
private byte[] aByte; // array for write(int val);
//*************************
//* Constructor
//*************************
public textareaStream(JTextArea ta) {
textArea=ta;
aByte=new byte[1];
}
//*************************
//* Writing methods
//*************************
public void write(int val) {
aByte[0]=(byte)val;
write(aByte,0,1);
}
public void write(byte[] ba) {
write(ba,0,ba.length);
}
public synchronized void write(byte[] ba,int str,int len) {
try {
for(int xa=0; xa<10; xa++) {
try {
textArea.append(new String(ba,str,len));
break;
} catch(Throwable thr) {
if (xa==9) {
thr.printStackTrace();
} else {
Thread.sleep(200);
}
}
}
} catch(Throwable thr) {
CharArrayWriter caw=new CharArrayWriter();
thr.printStackTrace(new PrintWriter(caw,true));
textArea.append(System.getProperty("line.separator","\n"));
textArea.append(caw.toString());
}
}
}
Это прекрасно работает, кроме случаев, когда вызывается метод "write" из обработчика событий.
В обработчике событий текст не пишетсяв текстовое поле, пока событие не закончится.Я хочу, чтобы текст записывался на консоль во время выполнения команды (это особенно необходимо для команд, занимающих много времени).Другими словами, когда пользователь нажимает клавишу ввода (например), выполняется длинный процесс при печати данных в JTextArea, но текст не отображается до тех пор, пока после не будет запущен весь процесс.
У кого-нибудь есть идеи, как мне это обойти?