私は Swing アプリケーションを構築しています。機能の一部は、テキストを視覚的および聴覚的に処理および出力する必要があります (Mary TTS を使用)。GUI とテキスト処理クラスが通信するための最良の方法についてアドバイスが必要です。
GUI クラスは JPanel のサブクラスです。その中に、LineProcesser と呼ばれる Runnable を実装するクラスがあり、オーディオ プレーヤーにディスパッチされるテキストを準備します。これをEDTから遠ざけるためにスレッドエグゼキューターを使用しています(これは最善の方法ではないかもしれませんが、私が求めている結果を達成しているようです)。
私の意図は、LineProcessor がすべてのテキストを実行し、各行の終わりで JTextArea を更新することです。さらに、特定の時点で停止してユーザー入力を待つ必要があります。ユーザー入力が完了したら、GUI クラスは処理を再開するよう指示する必要があります。
次のコードは、私が現在持っているものを示しています。
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");
}
}
}
LineProcessor は、変更が必要な GUI コンポーネントをどのように通知し、GUI 内からどのように一時停止および再起動できますか? Swing Worker、プロパティ/イベントリスナー、またはその他のものが必要かどうかについて混乱していますか? 私が読んだ例は理にかなっていますが、ここにあるコードにどのように適用できるかわかりません。