Java Swing 应用程序和 Leap Motion 监听器之间的通信
Communication between Java Swing Application and Leap Motion Listener
我想知道如何在 Java Swing 应用程序和我的跳跃动作侦听器之间进行通信。
因为我希望在我的应用程序中,当我单击一个按钮时,我可以通过跳跃动作看到的手指数量更改一个数字。
我有一个 Java Swing 应用程序:
public class KidCountingFrame extends JFrame
还有一个 Leap Motion Runnable:
public class LeapMouse implements Runnable
{
@Override
public void run()
{
CustomListener l = new CustomListener();
Controller c = new Controller();
c.addListener(l);
}
}
正在启动 Leap Motion 侦听器...:[=16=]
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 APP 之间进行通信。当 Listener 在 Singleton 模型中工作时,我保存所有信息,并在 Java Swing APP 中恢复我需要的信息。
正如所讨论的 here, the Listener
will be called asynchronously, typically from another thread. To avoid blocking the event dispatch thread, create your Listener
in the constructor of a SwingWorker
并安排您的 doInBackground()
实施到 publish()
感兴趣的框架; process()
然后可以在事件分派线程上处理这些帧。
或者,在 javax.swing.Timer
的 ActionListener
中以合适的速率轮询 Controller
。
我想知道如何在 Java Swing 应用程序和我的跳跃动作侦听器之间进行通信。
因为我希望在我的应用程序中,当我单击一个按钮时,我可以通过跳跃动作看到的手指数量更改一个数字。
我有一个 Java Swing 应用程序:
public class KidCountingFrame extends JFrame
还有一个 Leap Motion Runnable:
public class LeapMouse implements Runnable
{
@Override
public void run()
{
CustomListener l = new CustomListener();
Controller c = new Controller();
c.addListener(l);
}
}
正在启动 Leap Motion 侦听器...:[=16=]
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 APP 之间进行通信。当 Listener 在 Singleton 模型中工作时,我保存所有信息,并在 Java Swing APP 中恢复我需要的信息。
正如所讨论的 here, the Listener
will be called asynchronously, typically from another thread. To avoid blocking the event dispatch thread, create your Listener
in the constructor of a SwingWorker
并安排您的 doInBackground()
实施到 publish()
感兴趣的框架; process()
然后可以在事件分派线程上处理这些帧。
或者,在 javax.swing.Timer
的 ActionListener
中以合适的速率轮询 Controller
。