регистрация обработчика мыши, но обработчик не встроен в javafx

У меня есть приложение на JavaFX, которое становится немного большим, и я хочу, чтобы код оставался читабельным.

У меня есть LineChart, в который я хочу иметь встроенную функцию масштабирования, которая происходит при щелчке мыши. Я знаю, что мне нужно зарегистрировать прослушиватель мыши на диаграмме. Что я не могу понять из примеров Oracle, т.е. как написано здесь:

http://docs.oracle.com/javafx/2/events/handlers.htm

как НЕ определить мой обработчик в процессе регистрации. Другими словами, я хочу, чтобы тело обработчика (составляющее много строк кода) находилось в другом классе. Я могу это сделать? И если да, то как мне зарегистрировать обработчик на моей диаграмме в моем основном коде контроллера Javafx?


person passiflora    schedule 07.09.2012    source источник


Ответы (1)


Поместите свой обработчик в новый класс, который реализует Mouse EventHandler, и зарегистрируйте экземпляр вашего класса в целевом узле с помощью метода узла 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;
        }
      }
    }
  }
}

Пример вывода программы

person jewelsea    schedule 07.09.2012