Печать консоли в JFrame TextArea - действует странно (мигающий экран) - PullRequest
0 голосов
/ 09 марта 2020

У меня есть проект, который печатает числа построчно в консоли, и я успешно перенаправил его на мой GUI Jframe, который я использую для этого приложения. Однако, когда числа печатаются в TextArea, они не отображаются красиво один за другим, как скользящий список. Вместо этого я вижу, что вся TextArea мигает и печатает снова и снова. Как только чтение закончено, все выглядит правильно в TextArea. Был бы способ настроить это правильно, чтобы он печатался так же, как я это вижу в консоли?

Большое спасибо за что-нибудь полезное!

За перенаправление system.out, у меня есть следующий код:

package ibanchecker03;

import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JTextArea;



public class CustomOutputStream extends OutputStream {


    private JTextArea textArea;


    public CustomOutputStream(JTextArea textArea){

        this.textArea=textArea;


    }




    @Override
    public void write(int b) throws IOException {

        // redirects data to the text area
        textArea.append(String.valueOf((char)b));
        // scrolls the text area to the end of data
        textArea.setCaretPosition(textArea.getDocument().getLength());
        // keeps the textArea up to date
        textArea.update(textArea.getGraphics());
    }  



}

Затем внутри класса приложения у меня есть это, чтобы перенаправить вывод:

PrintStream printStream = new PrintStream(new CustomOutputStream(display));
        System.setOut(printStream);
        System.setErr(printStream);

1 Ответ

0 голосов
/ 09 марта 2020

Вместо записи каждого символа (и обновления textArea на символ), я бы предложил вам реализовать буфер (используя StringBuilder) и добавить к нему. Обновите textArea на flush() только в отдельном потоке. Что-то вроде

public class CustomOutputStream extends OutputStream {
    private StringBuilder sb = new StringBuilder();
    private JTextArea textArea;

    public CustomOutputStream(JTextArea textArea) {
        this.textArea = textArea;
    }

    @Override
    public void write(int b) throws IOException {
        sb.append((char) b);
    }

    @Override
    public void flush() {
        if (sb.length() > 0) {
            final String toWrite = sb.toString();
            sb.setLength(0);
            SwingUtilities.invokeLater(() -> {
                textArea.append(toWrite);
                textArea.setCaretPosition(textArea.getDocument().getLength());
                textArea.update(textArea.getGraphics());
            });
        }
    }

    @Override
    public void close() {
        flush();
        sb = null;
    }
}
...