Aktualisieren der GUI von einem Runnable

Ich erstelle eine Swing-Anwendung und ein Teil der Funktionalität sollte darin bestehen, Text visuell und akustisch zu verarbeiten und auszugeben (mithilfe von Mary TTS). Ich benötige einige Ratschläge, wie die Klassen für GUI und Textverarbeitung am besten kommunizieren können.

Die GUI-Klasse ist eine Unterklasse von JPanel. Darin befindet sich eine Klasse namens LineProcesser, die Runnable implementiert und den Text für den Versand an einen Audio-Player vorbereitet. Ich verwende einen Thread-Executor, um dies vom EDT fernzuhalten (das ist vielleicht nicht der beste Weg, aber es scheint das Ergebnis zu erzielen, das ich anstrebe).

Ich beabsichtige, dass LineProcessor den gesamten Text durchläuft und eine JTextArea am Ende jeder Zeile aktualisiert. Außerdem muss es an bestimmten Punkten anhalten und auf Benutzereingaben warten. Nach Abschluss der Benutzereingabe sollte die GUI-Klasse angeben, dass die Verarbeitung fortgesetzt werden soll.

Der folgende Code veranschaulicht, was ich derzeit habe:

<code>public class MyPanel extends JPanel {
    ExecutorService lineExecutor = Executors.newSingleThreadExecutor();
    Runnable lineProcessor = new LineProcessor();

    public class LineProcessor implements Runnable {

        private int currentLineNo = 0;

            public LineProcessor() {
            //  ...
            }

            @Override
            public void run() {
                // call getText();  
                // call playAudio();
                currentLineNo++;
            }
        }
    }

    private JButton statusLbl = new JLabel();       
    private JButton mainControlBtn = new JButton();

    private void mainControlBtnActionPerformed(ActionEvent evt) {

        if (mainControlBtn.getText().equals("Start")) {
                          lineExecutor.submit(lineProcessor);
                          mainControlBtn.setText("Running");
        }
    }
}
</code>

Wie kann LineProcessor GUI-Komponenten benachrichtigen, dass sie geändert werden müssen, und wie kann es innerhalb der GUI angehalten und neu gestartet werden? Ich bin verwirrt, ob ich einen Swing Worker, Property / Event Listener oder etwas anderes brauche. Die Beispiele, die ich gelesen habe, machen Sinn, aber ich kann nicht sehen, wie ich sie auf den Code anwenden kann, den ich hier habe.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage