Pisanie do EditorPane kolejnych linii

0

Witam,

mam spory problem z pisaniem do EditorPane kolejnych linii.

Kolejną linię wpisuję metodą:

public void printOutput(String napis, Color color, boolean bold, boolean italic) {
HTMLDocument doc = (HTMLDocument)(jEdiPan_Output.getDocument());

    try {
        SimpleAttributeSet attr = new SimpleAttributeSet();
        StyleConstants.setBold(attr , bold);
        StyleConstants.setItalic(attr, italic);
        StyleConstants.setForeground(attr, color);
        doc.insertString(doc.getLength(),napis, attr);
    } catch (Exception ex) {
        Logger.getLogger(LeonView.class.getName()).log(Level.SEVERE, null, ex);
    }
}

Problem:
gdy wywołuję tą metodę w pętli, np

for (int i=0;i<1000;i++){
printOutput("Napis nr "+i, Color.BLUE, true, true);
Thread.sleep(20);
}

wszystkie linie zostaną wypisane na EditorPane jednocześnie po upływie 1000 * 20 milisekund, mi zależy na tym żeby kolejne linie pojawiały się co 20 milisekund,
jednym słowem szukam sposobu by wymusić wypisanie linii od razu po wywołaniu metody printOutput, coś w stylu repaint() dla klasy Graphics.

0

z tego co rozumiem to chcesz po prostu mieć możliwość appendowania (dodawania) tekstu do JEditorPane? W takim razie idź do: http://justfuckinggoogleit.com/search.pl?query=jeditorpane+append+text

0

Dzięki wielkie za pomoc [soczek] , rzeczywiście nie zrozumiałeś pytania.

Dodawanie tekstu do JEditorPane nie jest problemem, można nawet zrobić to tak:

String s = new String("");

for (int i=0; i<1000; i++){
s = s + "coś";
jEditorPane.setText(s);
Thread.sleep(200);
}

I to też zadziałą, ale nie tak jak się spodziewamy. Chodzi o uzyskanie efektu pojawiania się kolejno dodawanego wpisu co 200 milisekund. To co wyżej zadziała w ten sposób, że całość tekstu (czyli 1000 sklejonych napisów "coś") pojawi się jednorazowo po upływie 1000*200 milisekund.

Tak więc chodzi o wymuszenie wypisania w czasie (że tak to ujmę) rzeczywistym, czyli od razu po wywołaniu metody setText(s);

0

spróbuj może w każdej iteracji wywołać Thread.yield();

0

Dzięki za odpowiedź,

niestety nie pomogło.

Zastanawiam się czy pomoże modyfikowanie jEditorPane za każdym razem w osobnym wątku, ale to takie troche wyciąganie armaty na muchy.

0

w źródle JEditorPane metoda setText(String) wygląda tak:

public void setText(String t) {
        try {
            Document doc = getDocument();
            doc.remove(0, doc.getLength());
            if (t == null || t.equals("")) {
                return;
            }
            Reader r = new StringReader(t);
            EditorKit kit = getEditorKit();
            kit.read(r, doc, 0);
        } catch (IOException ioe) {
            UIManager.getLookAndFeel().provideErrorFeedback(JEditorPane.this);
        } catch (BadLocationException ble) {
            UIManager.getLookAndFeel().provideErrorFeedback(JEditorPane.this);
        }
    }

Spróbuj może jakoś pobawić się we własną wersję tej metody (jakieś ręczne robótki na Documencie i EditorKicie). Możesz np. spróbować użyć jakiegoś własnego Readera zamiast StringReadera (może on jakieś buforowanie robi albo cuś)

1 użytkowników online, w tym zalogowanych: 0, gości: 1