У меня есть приложение с графическим интерфейсом, которое обрабатывает некоторые данные, оно преобразует строку текста в объект. Каждый созданный объект отображается в JTextPane или JTextArea. пример:
Строка № 1 создана 827401830 Строка № 2 создана 827401831
Таким образом, пользователь информируется о процессе.
За сценой есть поток, который работает в фоновом режиме и выполняет всю работу. Проблема в том, что одним из полей этого потока является JTextArea. и это выглядит так:
public class ConsumerThread implements Runnable
{
private ArrayBlockingQueue<TicketExchangeLine> queue;
private JTextArea textArea;
public ExchConsumerThread(ArrayBlockingQueue<TicketExchangeLine> queue, JTextArea textArea)
{
this.queue = queue;
this.textArea = textArea;
}
public void run()
{
try
{
while (true)
{
// check if end of file from producer POV
if (queue.peek()!=null && ...)
break;
MyObject obj = queue.take();
try{
//do the process here
textArea.append("here comes the output for the user..."+obj.getID);
}catch(Exception nfe)
{
//Oops
}
}
textArea.append("\nDone!");
}catch (InterruptedException e)
{
// Oops
}catch(Exception exp)
{
exp.printStackTrace();
}
}
}
Таким образом, приведенный выше код работает нормально и выполняет свою работу, но иногда я использую этот поток не из графического интерфейса, а затем без причины создаю экземпляр JTextArea; и что еще хуже, мне приходится все выводить из системы, чтобы увидеть процесс.
Вопрос: как я могу регистрировать все «обработанные данные» в JTextArea (или иногда JTextPane) без использования компонентов Swing в потоке?
Спасибо!