2015-03-11 4 views
-1

У меня трудное время для использования работника Swing для работы с моим проектом. Он имеет две программы: один - logic (full program), а другой - графический интерфейс. Я вызываю логическую программу из графического интерфейса. И из-за своей невосприимчивости я попытался использовать Swing-работника. Но даже если я использую Swing worker, он все еще не отвечает. Если я запускаю программу, она отображает графический интерфейс, но если я нажму на старте, начнется другая программа, и она перестанет отвечать на запросы.Неотвечивающий работник качания

Этот фрагмент кода из GUI program (полная программа):

btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      state.setText("Listening"); 
      System.out.println("Started Listening"); 
      state.setBackground(new Color(51, 204, 0)); 
      doRun(args); 
     } 
    }); 

public void doRun(String[] args) { 

    SwingWorker<Void, String> worker = new SwingWorker<Void, String>(){ 

     @Override 
     protected Void doInBackground() throws Exception { 
      // Object to use from another program 
      HelloWorld obj = new HelloWorld(); 
      obj.main(args); 
      return null; 
     }}; 
     worker.execute(); 
} 
+0

ли вы попробовать любого из [этих предложений] (http://stackoverflow.com/a/28977281/230513) в этом возможном [дубликате] (HTTP: // stackoverflow.com/q/28971487/230513)? – trashgod

+0

@trashgod Да, это то, что я пытался. Как вы сказали, а другие сказали использовать качели. Но я не могу сделать его гибким графическим интерфейсом или запустить программу sphinx в фоновом режиме. – Robin

+0

Вместо запуска 'HelloWorld # main()', создайте 'LiveSpeechRecognizer' и' publish() 'результаты. – trashgod

ответ

1

Потому что это требует взаимодействия, это может быть неудобно работать HelloWorld#main() в фоновом режиме. Как предложено here, введите LiveSpeechRecognizer непосредственно в свои SwingWorker и publish() промежуточные результаты для отображения в графическом интерфейсе. Вы можете указать Configuration информацию в конструкторе SwingWorker или передать его в качестве параметра. В общих чертах на основе примеров here и here,

private class BackgroundTask extends SwingWorker<Void, String> { 

    LiveSpeechRecognizer recognizer; 

    public BackgroundTask() { 
     statusLabel.setText((this.getState()).toString()); 
     Configuration configuration = new Configuration(); 
     configuration.setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us"); 
     configuration.setDictionaryPath("resource:/edu/cmu/sphinx/models/en-us/cmudict-en-us.dict"); 
     configuration.setLanguageModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us.lm.dmp"); 
     recognizer = new LiveSpeechRecognizer(configuration); 
     recognizer.startRecognition(true); 
    } 

    @Override 
    protected Integer doInBackground() { 
     while (!isCancelled()) { 
      SpeechResult result = recognizer.getResult(); 
      List<WordResult> list = result. getWords(); 
      for (WordResult w : list) { 
       // get information to publish, e.g. getPronunciation() 
       // publish(getSpelling()); 
      } 
     } 
    } 

    @Override 
    protected void process(java.util.List<String> messages) { 
     statusLabel.setText((this.getState()).toString()); 
     for (String message : messages) { 
      textArea.append(message + "\n"); 
     } 
    } 

    @Override 
    protected void done() { 
     recognizer.stopRecognition(); 
     statusLabel.setText((this.getState()).toString() + " " + status); 
     stopButton.setEnabled(false); 
     startButton.setEnabled(true); 
     bar.setIndeterminate(false); 
    } 

} 
Смежные вопросы