저는 Swing 응용 프로그램을 작성 중이며 기능 중 일부는 시각적으로나 청각 적으로 (Mary TTS를 사용하여) 일부 텍스트를 처리하고 출력해야합니다. GUI와 텍스트 처리 클래스가 통신 할 수있는 최선의 방법에 대한 조언이 필요합니다.runnable에서 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 구성 요소를 알릴 수 있습니다 :
은 다음 코드는 내가 현재 무엇을 보여? 스윙 워커, 속성/이벤트 리스너 또는 다른 것이 필요한지 혼란 스럽습니다. 내가 읽은 예제는 이해가되지만, 여기에있는 코드에 어떻게 적용 할 수 있는지 알 수 없습니다.
+1 좋은 제안입니다. 'invokeLater'는 진행 보고서에 완벽하지만'일시 중지 및 사용자 입력 대기 '부분에'invokeAndWait' 호출이 필요합니다. – Robin
aaaaach이 답변을 주셔서 감사합니다. 모든 답변 (지난 2 개월) 사용 (내 생각) 일반 invokeLater 간단한의 Runnable # 스레드와 비교 매우 복잡한 SwingWorker의 해결 방법을 제안, +1 – mKorbel
내 대답은하지만 둘 훨씬 더 포괄적으로 다른 측면을 해결하기는 OP의 로빈의 또는 mprabhat 년대만큼 좋지 않다 질문. 나는이 대답을 몇 분 안에 삭제할 것이라고 생각한다. 뱀장어의 –