2017-04-22 40 views
0

。我一直在寻找这个问题,但我还没有在这里找到它,所以我想这真的很简单。如何仅使用一个事件处理类为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!!!"); 
     } 
    } 
} 

我不知道这是非常低效的或坏的编程风格,但是是唯一的我到目前为止已经提出了解决方案。所以我想问问你这是一个很好的解决方案,还是如果有更好的解决方案,就把我的光芒放在眼里!事先感谢。

+0

有什么不对您的实现。你可以使用一个switch语句,否则,如果哪一个更有效。这个问题可能是主题。 – Sedrick

回答

-1

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

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

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

这里有几个YouTube上的教程,展示使用JavaFX与FXML的基础: https://www.youtube.com/watch?v=K7BOH-Ll8_g https://www.youtube.com/watch?v=LMdjhuYSrqg

相关问题