2015-09-25 17 views
0

通过代码添加JavaFX按钮时,如何调用另一个类的按钮的.setOnAction方法。从另一个类调用`setOnAction`

举例来说,如果我是处理同一类中的按钮按下:

public class SomeClass{ 
    Button continueButton = new Button("Continue"); 
    continueButton.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      someMethod(); 
     } 
    }); 
} 

但是如果我想利用这个控制器,怎么能“链接”的动作事件到内的方法其他类。
如:

public class SomeClass{ 
    private SomeClassController controller; 
    Button continueButton = new Button("Continue"); 
    continueButton.setOnAction(
     //Call continuePressed() on controller 
    ); 
} 

public class SomeClassController{ 
    public void continuePressed(){ 
     someMethod(); 
    } 
} 
+0

['setOnAction()'](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ButtonBase .html#setOnAction-javafx.event.EventHandler-)需要一个['EventHandler '](https://docs.oracle.com/javase/8/javafx/api/javafx/event/EventHandler.html),它是一个接口。所以,当你试图从它创建一个匿名类时,你需要重写'handle()'方法。 – ItachiUchiha

+1

我不完全理解你的问题。你为什么不能从handle()调用'controller.someMethod()'? SomeClassController的实例是不是有效的最终? – ItachiUchiha

回答

0

什么:

public class SomeClass{ 
    SomeClassController ctrl = new SomeClassController(); 
    Button continueButton = new Button("Continue"); 
    continueButton.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent event) { 
      ctrl.someMethod(); 
     } 
    }); 
} 

然后将事件处理程序附加到按钮,但其触发从控制器


或者调用一个方法:

public class SomeClass{ 
    SomeClassController ctrl = new SomeClassController(); 
    private SomeClassController controller; 
    Button continueButton = new Button("Continue"); 
    continueButton.setOnAction(ctrl.getHandler()); 
} 

public class SomeClassController{ 

    private EventHandler<ActionEvent> EH; 

    public SomeClassController(){ 
     EH = new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       someMethod(); 
      } 
     }); 
} 

public EventHandler<ActionEvent> getHandler(){ 
return EH; 
} 

public void someMethod(){ 
//DO SOMETHING 
} 
} 

我没有测试代码...

+0

所以我仍然需要把'handle(ActionEvent event)'不管是什么?用自定义方法替换'handle'似乎是合乎逻辑的,而不是调用'handle'和另一种方法。 – Dan

+1

不,您可以在控制器中创建EventHandler并将其置于setOnAction方法中。我会更新我的代码 –

1

Barbe Rouge是对的。使用Java 8语法一种略为简单的解决方案将是:

public class SomeClass { 

    private final SomeClassController controller = new SomeClassController(); 

    public SomeClass() { 
     final Button button = new Button("Click me!"); 
     button.setOnAction(controller::handle); 
    } 

} 

public class SomeClassController { 
    public void handle(ActionEvent event) { 
     // Do something 
    } 
}