You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:30:04