Threads und JTextArea

Status
Nicht offen für weitere Antworten.

Escorter

Bekanntes Mitglied
Hallo zusammen,

das hier ist meine Thread Methode run:
Code:
    public void run() {
    	Vector<String> v;
    	for(;;) {
    		try {
    			v = lsc.getLw().get(nummer).getLatest();
    			for(int i = 0;i<v.size();i++){
    				lsc.getLogConsole().get(nummer).setText(lsc.getLogConsole().get(nummer).getText()+"\n"+v.get(i));
    				//lsc.getLogConsole().get(nummer).append("\n"+v.get(i));

    			}
    			lsc.getLogConsole().get(nummer).setCaretPosition(lsc.getLogConsole().get(nummer).getDocument().getLength());
				sleep(100);
    		
    		} catch(InterruptedException e) {
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
	}

Code:
lsc.getLogConsole().get(nummer).setText(lsc.getLogConsole().get(nummer).getText()+"\n"+v.get(i));
mit dieser Zeile hänge ich neue Zeilen an meine Textbox an. Das ist aber ne schlecht Variante, da sie sehr langsam ist.
(Die länge des textes kann gut und gerne mehrere Tausend Zeilen sein, die möglicht schnell eingelesen und angezeigt werden sollen)

Also ging ich hin und habe es mit folgender Methode gemacht.
Code:
lsc.getLogConsole().get(nummer).append("\n"+v.get(i));
Der große nachteil ist, das diese mir die Textboxen nicht antomatsich neu anzeigt. D.h. der Thread läuft weiter und er abreitet auch weiter (überprüft duch System.out), aber die Anzeige kommt nicht mit.

Gibt es eine Möglichkeit die schnelligkeit vom append() zu erreichen(annährnd) und trotzdem wie bei setText() die Anzeige stehts aktualisieren lassen?

Gruß,
Esco
 
wie kann man nur 7x in einem Posting lsc.getLogConsole().get(nummer) schreiben,
kannst du dir dafür keine Variable a oder textArea deklarieren?

-----

ansonsten kann ich das Problem nicht nachvollziehen,
vom Quellcode der beiden Operationen her sollte es gehen:
Code:
    public void setText(String t) {
        try {
            Document doc = getDocument();
            if (doc instanceof AbstractDocument) {
                ((AbstractDocument)doc).replace(0, doc.getLength(), t,null);
            }
            else {
                doc.remove(0, doc.getLength());
                doc.insertString(0, t, null);
            }
        } catch (BadLocationException e) {
	    UIManager.getLookAndFeel().provideErrorFeedback(JTextComponent.this);
        }
    }

    public void append(String str) {
        Document doc = getDocument();
        if (doc != null) {
            try {
                doc.insertString(doc.getLength(), str, null);
            } catch (BadLocationException e) {
            }
        }
    }

und in meinem Test gehts auch, egal ov die TextArea leer oder gut gefüllt ist:

Code:
public class TestGUI
    extends JFrame
{

    private JTextArea a = new JTextArea();

    public TestGUI()
    {
        JScrollPane pane = new JScrollPane(a);
        add(pane);
        setSize(400, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        StringBuilder b = new StringBuilder();
        for (int i = 0; i < 1000; i++)
        {
            b.append("\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
        }
        a.setText(b.toString()); // edit: Zeile erst vergessen, nun eingefügt ;)

        Runnable r = new Runnable()
            {

                public void run()
                {
                    try
                    {
                        while (true)
                        {
                            Thread.sleep(500);
                            for (int i = 0; i < 10; i++)
                            {
                                Thread.sleep(100);
                                a.append("\nappend");
                                a.setCaretPosition(a.getDocument().getLength());
                            }
                            Thread.sleep(500);
                            for (int i = 0; i < 10; i++)
                            {
                                Thread.sleep(100);
                                a.setText(a.getText() + "\nsetText");
                                a.setCaretPosition(a.getDocument().getLength());
                            }
                        }
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }

            };
        new Thread(r).start();
    }

    public static void main(String[] args)
    {
        new TestGUI();
    }
}
 
SlaterB hat gesagt.:
wie kann man nur 7x in einem Posting lsc.getLogConsole().get(nummer) schreiben,
kannst du dir dafür keine Variable a oder textArea deklarieren?

Öhm ja gute Frage 🙂
Habs mir grad in ne Variable geschrieben. Keine Ahnung was mich da geritten hat.

Diese Zeile war der Übeltäter!
Code:
v = lsc.getLw().get(nummer).getLatest();
Bzw. du Methode getLatest, die hatte sich die ganze zeit verhaspelt so das das aktualisieren nicht klappte.

jetzt gehts...
Code:
aktLogConsole.append("\n"+v.get(i));

Vielen Danke SlaterB :toll:

Gruß,
Esco
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben