我想改变媒体来源,并在javafx中使用leap动作重新启动mediaplayer。
还有什么需要修复的吗? plz帮助(我是java的初学者&这是第一次编程)
这是我的密码
公共类Leaptest扩展应用程序{
private final LeapListener listener = new LeapListener();
private final Controller leapcontroller = new Controller();
private Media media = new Media("file:///C:/Users/halim.shin/workspace/Movie/flower.mp4");
private MediaPlayer player = new MediaPlayer(media);
private MediaView view = new MediaView(player);
@Override
public void start(Stage Stage) throws Exception {
leapcontroller.addListener(listener);
BorderPane root = new BorderPane();
int key_move_delta = 10;
double size_delta = 1.05;
root.setCenter(view);
Scene scene = new Scene(root,500,500,Color.BLACK);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
scene.setOnKeyPressed(new EventHandler<KeyEvent>(){
@Override
public void handle(KeyEvent event) {
// TODO Auto-generated method stub
switch(event.getCode()){
case UP : view.setTranslateY(view.getTranslateY() - key_move_delta); break;
case RIGHT : view.setTranslateX(view.getTranslateX() + key_move_delta); break;
case DOWN : view.setTranslateY(view.getTranslateY() + key_move_delta); break;
case LEFT : view.setTranslateX(view.getTranslateX() - key_move_delta); break;
case PAGE_UP : view.setScaleX(view.getScaleX()*size_delta); view.setScaleY(view.getScaleY()*size_delta); break;
case PAGE_DOWN : view.setScaleX(view.getScaleX()/size_delta); view.setScaleY(view.getScaleY()/size_delta); break;
case ENTER : player.pause(); break;
case SPACE : player.play(); break;
}
}
});
player.setCycleCount(MediaPlayer.INDEFINITE);
player.setMute(true);
// player.play(); //
Stage.setFullScreen(false);
Stage.setScene(scene);
Stage.show();
}
public void stop(){
leapcontroller.removeListener(listener);
}
public static void main(String[] args){
launch(args);
}}
公共类LeapListener扩展侦听器{
public void onConnect(Controller controller){
controller.enableGesture(Gesture.Type.TYPE_SWIPE);
controller.enableGesture(Gesture.Type.TYPE_CIRCLE);
controller.enableGesture(Gesture.Type.TYPE_SCREEN_TAP);
controller.enableGesture(Gesture.Type.TYPE_KEY_TAP);
}
public void onFrame(Controller controller){
Frame frame = controller.frame();
GestureList gestures = frame.gestures();
for(int i=0; i<gestures.count(); i++){
Gesture gesture = gestures.get(i);
**switch (gesture.type()){
case TYPE_SCREEN_TAP :
??????????????????
System.out.println("Key");
break;
default :
break;**
}
}
}}
发布于 2014-09-23 14:02:13
您必须通信两个不同的线程: JavaFX线程和Leap。
为此,您可以很容易地将ObjectProperty<T>对象添加到LeapListener类中,以便为给定的手势在每一帧设置所需的值。然后,您必须实现它们的相关公共ObservableValue<T>方法。
在JavaFX线程上,可以添加一个非殖化的ChangeListener<T>类来侦听ObservableValue中的任何更改。注意,您必须使用Platform.runLater()。
从LeapListener类开始:
public class LeapListener extends Listener {
private final BooleanProperty keyTap= new SimpleBooleanProperty(false);
public BooleanProperty keyTapProperty() { return keyTap; }
public enum DIRECTION { NONE,LEFT,RIGHT,UP,DOWN }
public ObjectProperty<DIRECTION> swipeGesture=new SimpleObjectProperty<>();
@Override
public void onConnect(Controller controller){
controller.enableGesture(Gesture.Type.TYPE_KEY_TAP);
controller.enableGesture(Gesture.Type.TYPE_SWIPE);
}
@Override
public void onFrame(Controller controller){
Frame frame = controller.frame();
// reset properties
keyTap.set(false);
swipeGesture.set(DIRECTION.NONE);
GestureList gestures = frame.gestures();
for(int i=0; i<gestures.count(); i++){
Gesture gesture = gestures.get(i);
switch (gesture.type()){
case TYPE_SCREEN_TAP :
keyTap.set(true);
break;
case TYPE_SWIPE:
SwipeGesture swipe = new SwipeGesture(gesture);
if(Math.abs(swipe.direction().getX()) >
Math.abs(swipe.direction().getY())){
if(swipe.direction().getX() > 0){
swipeGesture.set(DIRECTION.RIGHT);
} else {
swipeGesture.set(DIRECTION.LEFT);
}
} else {
if(swipe.direction().getY() > 0){
swipeGesture.set(DIRECTION.UP);
} else {
swipeGesture.set(DIRECTION.DOWN);
}
}
break;
default :
break;
}
}
}
}在您的JavaFX类中:
@Override
public void start(Stage stage) {
...
LeapListener leapListener=new LeapListener();
leapListener.keyTapProperty().addListener(
(ObservableValue<? extends Boolean> ov, Boolean t, final Boolean t1) -> {
if(t1){
Platform.runLater(() -> {
// React to Tap Gesture...
player.play();
});
}
});
leapListener.swipeGesture.addListener(
(ObservableValue<? extends LeapListener.DIRECTION> observable,
LeapListener.DIRECTION oldValue, LeapListener.DIRECTION newValue) -> {
Platform.runLater(()->{
// React to Swipe Gesture ...
switch(newValue){
case UP : break;
case RIGHT : break;
case DOWN : break;
case LEFT : break;
}
});
});
player.setCycleCount(MediaPlayer.INDEFINITE);
player.setMute(true);
// player.play(); //
stage.setFullScreen(false);
stage.setScene(scene);
stage.show();
}只要注意,每当Leap运动控制器检测到一个点击/滑动手势,属性就会被更新,监听器就会被触发。在JavaFX线程中,您现在可以响应这些手势了。
https://stackoverflow.com/questions/25985448
复制相似问题