2014-11-22 3 views
-1

Я работаю над этим приложением в качелях. Это на самом деле голосовой контроль ... Я даю голосовые команды, и некоторые действия выполняются. Но дело в том, что после его развертывания он находится на бесконечный цикл while, он непрерывно ищет голос (который должен ... разоблачить jarvis фильма о железном человеке) .. но это в то время как цикл замерзает мой gui. Я не могу его обновить. Не могу скрывать панели, не могу воспроизводить звук.бесконечный цикл в качели

свинга рабочего и качели utilitie s не должен, т помочь мне, потому что они проверяют код после определенного периода времени, в то время как мне нужно реальное распознавание голоса времени ..

Так что можно сделать? Могу ли я заставить свой gui взаимодействовать с другой программой Java? Как java prog сделает голосовое распознавание и передаст ответ на gui?

Вот код эскиз

class{ 
    main(){ 
    new class() 
} 

class(){ 
    frames + content pane initialized 
    mousePresssed() 
    { 
     ///the while loop starts here and looks for voice commands..any gui update code doesnt work here..while it detects the voice fine..continuously. 

    } 
} 
+0

в то время (portId == NULL && portEnum.hasMoreElements()) ... вы имеете в виду, пока portId! = null? – ha9u63ar

+1

1) Слова, напечатанные во всем нижнем регистре, трудно читать, например, пытаться выслушать кого-то, кто бормочет. Пожалуйста, используйте письмо в верхнем регистре в начале предложений, для слова I и собственные имена, такие как 'ArrayList' или Oracle. 2) Чтобы получить более эффективную помощь, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (Short, Самостоятельный, правильный пример). 3) Один из способов получить изображения для примера - это горячая ссылка на изображения, видимые в [этот вопрос и ответы] (http://stackoverflow.com/q/19209650/418556). –

+0

umm.no..это часть кода правильная .. это цикл while, который дает мне проблемы @hagubear – aaaaaaa

ответ

2

В принципе, вы должны иметь свой бесконечный бег петли в другую тему, чем EDT. И всякий раз, когда вы хотите обновить свой графический интерфейс, сделайте это на EDT, используя вызов SwingUtilities.invokeLater. Задержка для вызова обновления GUI в invokeLater будет едва заметна. SwingUtilities.invokeLater не основан на механизме опроса. Единственное, что он делает, это преобразовать Runnable в событие, которое затем отправляется на EDT. Затем EDT выполнит ваш Runnable как можно скорее, поэтому большую часть времени, мгновенно.

Теперь для шаблона о том, как общаться между вашим потоком и вашим графическим интерфейсом, вы можете просто использовать шаблон «Наблюдатель». Ваш поток распознавания голоса - это как-то модель, и ваш пользовательский интерфейс просто прослушивает изменения на этой модели. Всякий раз, когда модель изменяется, пользовательский интерфейс обновляется.

Я сделал фиктивный пример такой вещи. Для шаблона «Наблюдатель» я использовал для него PropertyChangeSupport. Для модели, я создал фиктивный поток, который генерирует «команду» случайную каждый раз в каком-то время, а само соответственно обновление пользовательского интерфейса:

import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.beans.PropertyChangeSupport; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class TestThreadingAndGUI implements PropertyChangeListener { 

    private JFrame frame; 

    private JLabel label; 

    private DummyRunnable runnable; 

    public static class DummyRunnable implements Runnable { 

     private PropertyChangeSupport pcs = new PropertyChangeSupport(this); 

     private String command; 

     public void addPropertyChangeListener(PropertyChangeListener listener) { 
      pcs.addPropertyChangeListener(listener); 
     } 

     @Override 
     public void run() { 
      Random random = new Random(); 
      while (true) { 
       try { 
        Thread.sleep(((random.nextInt(3)) + 1) * 1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       StringBuilder sb = new StringBuilder(); 
       for (int i = 0; i < 15; i++) { 
        sb.append((char) ('a' + random.nextInt(26))); 
       } 
       setCommand(sb.toString()); 
      } 
     } 

     public String getCommand() { 
      return command; 
     } 

     private void setCommand(String command) { 
      String old = this.command; 
      this.command = command; 
      pcs.firePropertyChange("command", old, command); 
     } 
    } 

    protected void initUI(DummyRunnable runnable) { 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     label = new JLabel(); 
     label.setHorizontalAlignment(JLabel.CENTER); 
     frame.add(label); 
     frame.setSize(600, 600); 
     frame.setVisible(true); 
     this.runnable = runnable; 
     runnable.addPropertyChangeListener(this); 
    } 

    private void executeCommand() { 
     label.setText(runnable.getCommand()); 
    } 

    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     if (evt.getPropertyName().equals("command")) { 
      // Received new command (outside EDT) 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        // Updating GUI inside EDT 
        executeCommand(); 
       } 
      }); 
     } 
    } 

    public static void main(String[] args) { 
     final DummyRunnable runnable = new DummyRunnable(); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       TestThreadingAndGUI testThreadingAndGUI = new TestThreadingAndGUI(); 
       testThreadingAndGUI.initUI(runnable); 

      } 
     }); 
     new Thread(runnable).start(); 
    } 

} 
+0

Я вижу основной рабочий процесс. Но я собираюсь использовать интерфейс 'observer' в первый раз. И моя голова слишком сильно пульсирует, чтобы перейти к его подробному объяснению. Поэтому, если бы мне пришлось заменить мой голос, получая код внутри этого цикл и мой код gui внутри этого 'initUI'..и оставить все как есть ... так, как будто это ... он будет работать? – aaaaaaa

+0

@aaaaaaa Нет причин для этого не работать.Единственный «трюк» - это когда вы получаете уведомление от вашего распознавания голоса в своем пользовательском интерфейсе, вам нужно поместить код, который обновляет пользовательский интерфейс в вызове 'invokeLater' (чтобы убедиться, что пользовательский интерфейс обновлен на EDT). Спасибо за ваше сообщение. –

+0

спасибо. ... сейчас все работает нормально ... – aaaaaaa