当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中只用一个事件处理类处理同一个节点的几个事件?

梁宏才
2023-03-14

每个人 都。我一直在寻找这个问题,但我在这里没有找到它,所以我想它真的很简单。

我正在用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个答案

谷梁凌
2023-03-14

已经有一个解决方案,它正在创建一个带有FXML文件,控制器和Main类的JavaFX项目。像IntelliJ和NetBeans这样的IDE支持让你创建一个JavaFX项目,它会自动为你创建这些文件,但我不确定你是否必须添加一个插件才能使它工作, 我不记得了。

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

如果你使用FXML,你可以将按钮指向你的FXML文档中的方法,这样你就不需要匿名的事件处理类。取而代之的是,让按钮调用控制器类中的一个特定方法。

以下是几个youtube教程,展示了将JavaFX与FXML结合使用的基础知识:https://www.youtube.com/watch?v=K7BOH-Ll8_ ghttps://www.youtube.com/watch?v=LMdjhuYSrqg

 类似资料:
  • 在JavaFX中,是否可以从一个类中处理多个事件类型(例如ActionEvent、MouseEvent等),而无需匿名事件处理程序?我尝试了以下操作,但这只是产生了一个编译时错误。

  • 我正在构建一个Java应用程序。这个应用程序是一个典型的“油漆”应用程序,你可以选择一种颜色,并在画布上绘制。除了...我将有一个圆圈数组分布在画布的顶部。我希望这些圆立即改变颜色,如果,当用户正在绘制和鼠标得到圆的X(10)个像素(其中X是绘制的线的宽度除以2)。 这是我的密码。我有一张画布是一组的一部分。我还创建了一个圆圈节点,并将其作为组的一部分。我想我需要以某种方式创建一个鼠标事件,当用户

  • 我计划创建一个单独的EventHandler类,它将为我的JavaFX类中的所有控件处理所有类型的事件。 例如,我添加了我的自定义事件处理程序类,以如下方式处理动作事件,它工作得很好: 以下是我的自定义事件处理程序类代码: 但是当我尝试将addEventHandler之一更改为MouseEvent并按以下方式修改主EventHandler类时,它会显示错误“Interface eventhandl

  • 我在视图布局中使用了三个EditText小部件,用于三个不同的过滤器。如果我输入其中一条,另一条文本不应该是空白的吗? 下面是我的片段: GenericTextWatcher方法: 当我运行这个程序并输入EditText时,logcat看起来是这样的: 03-03 15:25:39.616 25952-25952/com.xyz.abcI/art:显式并发标记扫描GC释放23671(1194KB)

  • 我正在尝试在javaFx中为特殊需要定制一个快捷方式系统。 这种特殊需求使得不可能使用KeyCombinaison(只限制一个键修饰符是不可接受的)。 我已经做了我适当的KeyCompin联络员系统,现在我想从节点调用一个处理程序(我在控制器之外)。但是我找不到任何优雅的解决方案来执行这个。 有一个按钮声明: 在我想从我的快捷方式代码调用控制器的操作之后。 和标准控制器。 我可以做一些工作,例如使

  • null 我想要达到的目标 我希望由一个实例发布的事件只由同一个实例处理 如果instance1发布eventX,那么只有instance1应该处理eventX null