2015-01-17 19 views
1

我想知道如何在Java Swing應用程序和我的跳躍運動監聽器之間進行通信。Java Swing應用程序和Leap Motion監聽器之間的通信

因爲我希望在我的應用程序中,當我點擊一個按鈕時,我可以用閏秒動作看到的手指數來改變一個數字。

我有一個Java Swing應用程序:

public class KidCountingFrame extends JFrame 

而且一個大躍進運動的Runnable:

public class LeapMouse implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     CustomListener l = new CustomListener(); 
     Controller c = new Controller(); 
     c.addListener(l); 
    } 
} 

這是發動大躍進運動監聽...:

public class CustomListener extends Listener 

也許我必須使用設計模式?

*更新:*

我嘗試應用ProgressBarDemo在我的項目,並按照吃茶。

但是一個錯誤發生時,我把聽者的SwingWorker類的構造函數:

Exception in thread "Thread-1443" java.lang.NullPointerException: null upcall object 

這裏我更新的代碼:

public class PanelLeapFingers extends JPanel implements ActionListener, 
PropertyChangeListener 
{ 
     private JButton digitDisplayButton; 
     private Task task; 

     class Task extends SwingWorker<Void, Void> 
     { 

      public Task() 
      { 
       try 
       { 
        NbFingersListener l = new NbFingersListener(); 
        Controller c = new Controller(); 
        c.addListener(l); 
       } 
       catch(Exception e) 
       { 
        System.out.println(e.getMessage()); 
       } 
      } 

      @Override 
      public Void doInBackground() 
      { 
       // In background : 
       // Find how digit fingers are shown by the user 
       int progress = 0; 
       //setProgress(????); //I don't really know how call the listener here 
       setProgress(5); //Here it's just to make a test 

       return null; 
      } 

      @Override 
      public void done() 
      { 
       Toolkit.getDefaultToolkit().beep(); 
       digitDisplayButton.setEnabled(true); 
       setCursor(null); // turn off the wait cursor 
      } 
    } 

     public PanelLeapFingers() 
     { 
     super(new BorderLayout()); 
     digitDisplayButton = new JButton("?"); 
     digitDisplayButton.setFont(new Font("Arial", Font.PLAIN, 40)); 
     digitDisplayButton.setActionCommand("start"); 
     digitDisplayButton.addActionListener(this); 

     JPanel panel = new JPanel(); 
     panel.add(digitDisplayButton); 
     add(panel, BorderLayout.PAGE_START); 
     setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 

     } 

     public void actionPerformed(ActionEvent evt) 
     { 
     digitDisplayButton.setEnabled(false); 
     setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
     task = new Task(); 
     task.addPropertyChangeListener(this); 
     task.execute(); 
     } 

     public void propertyChange(PropertyChangeEvent evt) { 
     if ("progress" == evt.getPropertyName()) { 
      int progress = (Integer) evt.getNewValue(); 
      digitDisplayButton.setText(progress+""); 
     } 
     } 

} 

我不知道要對好辦法,我不明白我在setProgress()函數中如何從我的監聽器接收信息。

編輯: 解決方案:最後,我已經決定使用單例模式聽衆和Java Swing應用程序之間的通信。當Listener在Singleton模型中工作時,我保存所有信息,並且恢復我在Java Swing APP中需要的信息。

回答

3

正如討論的hereListener將被異步調用,通常從另一個線程調用。爲了避免阻塞event dispatch thread,請在SwingWorker的構造函數中創建Listener,並安排將doInBackground()實現爲publish()感興趣的幀;然後process()可以在事件分派線程上處理這些幀。

或者,在javax.swing.TimerActionListener中以適當的比率輪詢Controller

+0

感謝您的幫助,這些信息讓我更加喜歡這種方式,但是我遇到了一些與這種情況相關的麻煩(請參閱更新)。 –

+0

我不知道你的'NbFingersListener'如何與工作人員進行通信。您可能想嘗試在'doInBackground()'中輪詢'Controller';可以在那裏「睡()」來獲得可用的速率。 – trashgod

+0

我已經解決了LeapMotionListener和FingerPanel的SwingWorker的doInBackground()中存在的Singleton模型的問題。多謝。 –

相關問題