JavaFX不使用匿名类如何通过自定义EventHandler修改Rectangle填充色
JavaFX自定义EventHandler操作界面元素解决方案
错误原因
rec是FarbtestEventHandlerAusserhalb类start方法中的局部变量,作用域仅限start方法内部,独立的MyEventHandler类没有权限访问该变量- 你在
handle方法中新建的FarbtestEventHandlerAusserhalb实例和当前运行的界面实例完全无关,即使把rec改成成员变量,访问的也是新实例的对象,不会生效到当前界面
解决方案:通过构造方法传递需要操作的Rectangle对象
这是最符合解耦设计的实现方式,不需要修改原有类的结构,也不需要使用匿名类。
1. 修改自定义EventHandler类,增加带Rectangle参数的构造方法
import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; public class MyEventHandler implements EventHandler<ActionEvent>{ // 定义成员变量存储要操作的Rectangle对象 private Rectangle targetRec; // 构造方法传入目标Rectangle public MyEventHandler(Rectangle rec) { this.targetRec = rec; } @Override public void handle(ActionEvent e) { int rot = (int) (Math.random() * 255.0); int gruen = (int) (Math.random() * 255.0); int blau = (int) (Math.random() * 255.0); // 操作传入的Rectangle对象 targetRec.setFill(Color.rgb(rot, gruen, blau)); } }
2. 修改FarbtestEventHandlerAusserhalb类中绑定事件的代码
只需要修改给按钮设置事件的一行,把当前的rec对象传入构造方法即可:
// 原代码:btn.setOnAction(new MyEventHandler()); // 修改为: btn.setOnAction(new MyEventHandler(rec));
可选替代方案:内部类实现
如果你不需要在其他地方复用这个EventHandler,也可以把MyEventHandler定义为FarbtestEventHandlerAusserhalb的非静态内部类,同时把rec提升为类的成员变量,内部类可以直接访问外部类的成员变量,不需要手动传参。
内容的提问来源于stack exchange,提问作者Blaxxker
相关产品推荐
相关产品推荐

