我想知道如何在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中需要的信息。
感謝您的幫助,這些信息讓我更加喜歡這種方式,但是我遇到了一些與這種情況相關的麻煩(請參閱更新)。 –
我不知道你的'NbFingersListener'如何與工作人員進行通信。您可能想嘗試在'doInBackground()'中輪詢'Controller';可以在那裏「睡()」來獲得可用的速率。 – trashgod
我已經解決了LeapMotionListener和FingerPanel的SwingWorker的doInBackground()中存在的Singleton模型的問題。多謝。 –