如何通过事件源对象获取其所属类引用以访问实例变量
如何从JavaFX事件处理器中访问触发按钮所属类的成员变量?
首先先纠正下你代码里的两个小语法错误,不然编译会报错:
- Button 实例化需要加括号:
Button btn = new Button(); - JavaFX的
Text是类,不能直接赋值字符串,应该写成:Text txt = new Text("hello");
回到你的核心问题:从事件处理器中通过event.getSource()拿到Button后,如何获取它所属的myClass实例,进而访问txt变量?这里有几种实用的方案:
方案1:使用Lambda表达式直接捕获外部类引用
如果你的事件处理器是直接在myClass内部定义的,用Lambda表达式可以直接访问当前myClass的实例,甚至不需要通过event.getSource():
public class myClass { Button btn = new Button(); Text txt = new Text("hello"); public myClass() { // 用Lambda表达式作为事件处理器,直接访问当前类的txt变量 btn.setOnMouseEvent(event -> { System.out.println(txt.getText()); // 直接访问txt // 如果确实需要拿到myClass实例,直接用this myClass parentInstance = this; System.out.println(parentInstance.txt.getText()); }); } }
方案2:给Button设置UserData存储类实例
如果你的事件处理器是单独的外部类(比如你提到的myHandler是一个独立的EventHandler实现类),可以给Button绑定当前myClass的实例,之后在处理器中取出:
public class myClass { Button btn = new Button(); Text txt = new Text("hello"); public myClass() { // 将当前myClass实例存入Button的userData btn.setUserData(this); btn.setOnMouseEvent(new myHandler()); } } // 独立的事件处理器类 class myHandler implements EventHandler<MouseEvent> { @Override public void handle(MouseEvent event) { Button sourceBtn = (Button) event.getSource(); // 取出绑定的myClass实例 myClass parentInstance = (myClass) sourceBtn.getUserData(); // 现在可以访问txt变量了 System.out.println(parentInstance.txt.getText()); } }
方案3:使用内部类持有外部类引用
如果你的myHandler是myClass的非静态内部类,它会自动持有外部类的引用,直接就能访问txt:
public class myClass { Button btn = new Button(); Text txt = new Text("hello"); public myClass() { btn.setOnMouseEvent(new myHandler()); } // 非静态内部类 class myHandler implements EventHandler<MouseEvent> { @Override public void handle(MouseEvent event) { // 直接访问外部类的txt变量 System.out.println(txt.getText()); // 或者显式获取外部类实例 myClass parentInstance = myClass.this; System.out.println(parentInstance.txt.getText()); } } }
注意:如果你的txt变量是私有成员,记得给它添加getter方法(比如public Text getTxt()),这样外部类或者处理器才能合法访问哦。
内容的提问来源于stack exchange,提问作者MFranc
相关产品推荐
相关产品推荐

