如何仅使用一个事件处理类来处理JavaFX中同一节点的多个事件?

时间:2017-04-22 12:35:34

标签: java javafx

大家。我一直在寻找这个问题,但我还没有在这里找到它,所以我猜它真的很简单。

我只需一个按钮即可在JavaFX中创建一个非常简单的应用程序。现在我想处理它的事件(比如当它被按下或何时被发布),但是当我在互联网上看到例子时,它们都使用匿名类(以及每个事件的不同类),这使得代码在我看来很脏。这就是为什么我想把事件处理程序放在一个单独的类中并将它们添加到按钮中。

问题在于,我不知道是否必须为每个活动创建一个不同的课程,我认为这不是很酷。所以我提出了一个想法。在类的handle()方法中,我检查正在进行的事件类型并处理它。 这是代码

主要课程

public class Main extends Application{

    Button button;
    PruebaEventHandler evhandler;

    public Main() {
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setTitle("h0i");

        button = new Button("Púlsame!");
        evhandler = new PruebaEventHandler();
        button.addEventHandler(MouseEvent.ANY, evhandler);
        StackPane layout = new StackPane();
        layout.getChildren().add(button);

        Scene scene = new Scene(layout, 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

EventHandler类

public class PruebaEventHandler implements EventHandler<MouseEvent>{
    @Override
    public void handle(MouseEvent event){
        if(event.getEventType().equals(MouseEvent.MOUSE_PRESSED)){
            System.out.printf("Te cogí\n");
        }
        if(event.getEventType().equals(MouseEvent.MOUSE_RELEASED)){
            System.out.printf("\nMe ha soltado!!!");
        }
    }
}

我不知道这是非常低效还是糟糕的编程风格,但这是我到目前为止唯一提出的解决方案。所以我想问你这是否是一个好的解决方案,或者,如果有更好的解决方案,请让我对你有所了解!先谢谢。

1 个答案:

答案 0 :(得分:-1)

已经存在一个解决方案,即使用FXML文件,Controller和Main类创建JavaFX项目。像IntelliJ和NetBeans这样的IDE支持让你创建一个JavaFX项目,它自动为你创建这些文件,但我不确定你是否必须添加一个插件才能使它工作,我不记得。< / p>

FXML文件负责处理GUI,例如在场景中放置一个按钮,使用它的最简单方法是使用Oracle提供的SceneBuilder,也可以将其集成到IDE中。

如果使用FXML,您可以将按钮指向FXML文档中的方法,因此您不需要为事件处理程序提供匿名类。相反,您可以在Controller类中将按钮调用为特定方法。

以下是一些youtube教程,展示了使用FXML的JavaFX的基础知识: https://www.youtube.com/watch?v=K7BOH-Ll8_g https://www.youtube.com/watch?v=LMdjhuYSrqg