在javafx中注册鼠标处理程序,但处理程序不是内联的

在javafx中注册鼠标处理程序,但处理程序不是内联的,java,javafx-2,mouse-listeners,Java,Javafx 2,Mouse Listeners,我有一个JavaFX中的应用程序,它变得有点大,我想让代码保持可读性 我有一个折线图,我想有放大功能内置,发生在鼠标点击。我知道我需要在图表中注册鼠标侦听器。我无法从Oracle示例中了解到的内容(如本文所述): 是如何不让我的处理程序内联定义到注册。换句话说,我希望处理程序的主体(有许多行代码)位于另一个类中。我可以这样做吗?如果是这样,我如何在我的主Javafx控制器代码中将处理程序注册到我的图表中 将处理程序放在一个新类中,该类实现鼠标事件处理程序,并通过节点的setOnClicked方

我有一个JavaFX中的应用程序,它变得有点大,我想让代码保持可读性

我有一个折线图,我想有放大功能内置,发生在鼠标点击。我知道我需要在图表中注册鼠标侦听器。我无法从Oracle示例中了解到的内容(如本文所述):


是如何不让我的处理程序内联定义到注册。换句话说,我希望处理程序的主体(有许多行代码)位于另一个类中。我可以这样做吗?如果是这样,我如何在我的主Javafx控制器代码中将处理程序注册到我的图表中

将处理程序放在一个新类中,该类实现鼠标事件处理程序,并通过节点的setOnClicked方法向目标节点注册一个类的实例

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.*;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/** 
 * JavaFX sample for registering a click handler defined in a separate class.
 * http://stackoverflow.com/questions/12326180/registering-mouse-handler-but-handler-not-inline-in-javafx
 */ 
public class ClickHandlerSample extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(final Stage stage) throws Exception {
    stage.setTitle("Left click to zoom in, right click to zoom out");
    ImageView imageView = new ImageView("http://upload.wikimedia.org/wikipedia/commons/b/b7/Idylls_of_the_King_3.jpg");
    imageView.setPreserveRatio(true);
    imageView.setFitWidth(150);
    imageView.setOnMouseClicked(new ClickToZoomHandler());

    final StackPane layout = new StackPane();
    layout.getChildren().addAll(imageView);
    layout.setStyle("-fx-background-color: cornsilk;");
    stage.setScene(new Scene(layout, 400, 500));
    stage.show();
  }

  private static class ClickToZoomHandler implements EventHandler<MouseEvent> {
    @Override public void handle(final MouseEvent event) {
      if (event.getSource() instanceof Node) {
        final Node n = (Node) event.getSource();
        switch (event.getButton()) {
          case PRIMARY:
            n.setScaleX(n.getScaleX()*1.1);
            n.setScaleY(n.getScaleY()*1.1);
            break;
          case SECONDARY:
            n.setScaleX(n.getScaleX()/1.1);
            n.setScaleY(n.getScaleY()/1.1);
            break;
        }
      }
    }
  }
}
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.scene.*;
导入javafx.scene.image.ImageView;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
/** 
*用于注册在单独类中定义的单击处理程序的JavaFX示例。
* http://stackoverflow.com/questions/12326180/registering-mouse-handler-but-handler-not-inline-in-javafx
*/ 
公共类ClickHandlerSample扩展应用程序{
公共静态void main(字符串[]args){launch(args);}
@覆盖公共无效开始(最终阶段)引发异常{
stage.setTitle(“左键单击放大,右键单击缩小”);
ImageView ImageView=新的ImageView(“http://upload.wikimedia.org/wikipedia/commons/b/b7/Idylls_of_the_King_3.jpg");
imageView.setPreserveRatio(真);
imageView.setFitWidth(150);
setOnMouseClicked(新建ClickToZoomHandler());
最终StackPane布局=新StackPane();
layout.getChildren().addAll(imageView);
layout.setStyle(“-fx背景色:cornsilk;”);
舞台场景(新场景(布局图,400500));
stage.show();
}
私有静态类ClickToZoomHandler实现EventHandler{
@重写公共无效句柄(最终MouseeEvent事件){
if(event.getSource()instanceof Node){
最终节点n=(节点)event.getSource();
开关(event.getButton()){
主要病例:
n、 setScaleX(n.getScaleX()*1.1);
n、 设置刻度(n.getScaleY()*1.1);
打破
个案二:
n、 setScaleX(n.getScaleX()/1.1);
n、 setScaleY(n.getScaleY()/1.1);
打破
}
}
}
}
}