webentwicklung-frage-antwort-db.com.de

JTextArea während der Verarbeitung dynamisch aktualisieren?

Ich versuche eine sehr einfache Swing-Benutzeroberfläche zu erstellen, die Informationen über eine JTextArea auf dem Bildschirm protokolliert, während die Verarbeitung im Hintergrund erfolgt. Wenn der Benutzer auf eine Schaltfläche klickt, möchte ich bei jedem Anruf:

textArea.append(someString + "\n");

um sofort in der Benutzeroberfläche zu erscheinen.

Momentan zeigt die JTextArea nicht alle Protokollinformationen an, bis die Verarbeitung nach dem Klicken auf die Schaltfläche abgeschlossen ist. Wie kann ich es dynamisch aktualisieren?

23
digiarnie

Ich bin mit meiner Bewerbung auf dasselbe Problem gestoßen. Ich hatte eine Schaltfläche "Ausführen" in meiner Anwendung, die einige Aktionen ausgeführt und die Ergebnisse in eine JTextArea-Funktion ausgegeben hat. Ich musste die Methode von einem Thread aus aufrufen. Hier ist was ich getan habe.

Ich habe mehrere Optionsfelder für Aktionen, die ausgeführt werden können, und dann eine Schaltfläche "Ausführen", um diese bestimmte Aktion auszuführen. Ich habe eine Aktion namens Validate. Wenn ich also das Optionsfeld überprüfe und auf die Schaltfläche "Ausführen" klicke, wird die Methode validate () aufgerufen. Also habe ich diese Methode zuerst in eine innere Klasse eingeordnet, die Runnable implementierte

class ValidateThread implements Runnable {
    public void run() {
        validate();
    }
}

Diesen Thread habe ich dann im ActionListener des "Run" -Buttons als so bezeichnet

runButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        // Some code checked on some radio buttons
        if(radioButton.isSelected()) {
            if(radioButton.getText().equals("VALIDATE")) {
               Runnable runnable = new ValidateThread();
               Thread thread = new Thread(runnable);
               thread.start();
            }
        }
    }

});

Voila! Die Ausgabe wird jetzt an JTextArea gesendet.

Nun werden Sie feststellen, dass JTextArea nicht mit dem Text nach unten scrollen wird. Sie müssen also die Caret-Position einstellen

textArea.setCaretPosition(textArea.getText().length() - 1);

Wenn die Daten jetzt zu JTextArea hinzugefügt werden, wird immer ein Bildlauf nach unten durchgeführt.

24
Ascalonian

Versuche dies:

jTextArea.update(jTextArea.getGraphics());
38
petr

Wie andere gesagt haben, erfordert dies Multithreading. In Concurrency können Sie unter Swing nachschauen. 

Eine Lösung wäre die Implementierung der Verarbeitung mit einem SwingWorker. Die doInBackground-Methode würde die Verarbeitung implementieren, und Sie würden die Publish-Methode mit dem String aufrufen, der als Argument angehängt werden soll. Ihr SwingWorker überschreibt dann die Prozessmethode, um ein String-Argument an den Textbereich anzuhängen.

4
Mark

Es tut mir leid für die Beantwortung dieser Frage, die vor 4 Jahren gepostet wurde, aber ich habe eine andere Lösung, die für mich funktioniert hat. Ich habe gerade Zeiger verwendet, um die JTextAreaas zu aktualisieren:

//JScrollPane variable pane initialized with JTextArea area
//We will update area with new text
JTextArea temp = (JTextArea) pane.getViewPort().getView();
//new text to add
JTextArea c = new JTextArea();
c.append("text \n)";
//update through pointers
temp = c;
pane.validate();
1
collielimabean

Dafür benötigen Sie Multithreading. Bereit, den Sprung zu wagen?

0
Spencer Ruport

Wenn es sich um Multithreading handelt, müssen Sie dies ausprobieren. http://www.devarticles.com/c/a/Java/Multithreading-in-Java/

0
binarycreations