JavaFX如何调用并传递控件对象,实现通用获取控件文本的方法?
实现方案1:完全匹配你要求的调用形式
你代码里的X对应Class<T>,通过泛型匹配你传入的控件类型,因为JavaFX中带getText()的控件没有统一的公共接口定义该方法,这里用反射实现方法调用:
private <T> String getText(Node item, Class<T> controlType) { String txt = ""; // 判断item是否为传入控件类型的实例 if (controlType.isInstance(item)) { try { // 反射调用getText方法 T castItem = controlType.cast(item); txt = (String) controlType.getMethod("getText").invoke(castItem); } catch (Exception ignore) { // 传入的类型没有getText方法时直接返回空字符串 } } // 可以按需在这里添加非空判断逻辑 return txt; }
调用方式和你预期的完全一致:
getText(txtSample, TextField.class); getText(lblSample, Label.class); getText(chkSample, CheckBox.class);
实现方案2:更简洁的无额外参数版本
如果不需要指定判断类型,还可以直接匹配JavaFX中两类所有带文本的控件的公共父类,不需要额外传参:
Labeled:是Label、CheckBox、Button、RadioButton等所有带展示文本的控件的抽象父类,自带getText()方法TextInputControl:是TextField、TextArea、PasswordField等所有输入类文本控件的抽象父类,自带getText()方法
实现代码:
private String getText(Node item) { String txt = ""; if (item instanceof Labeled labeled) { txt = labeled.getText(); } else if (item instanceof TextInputControl textInput) { txt = textInput.getText(); } // 可以按需在这里添加非空、去空判断逻辑 return txt == null ? "" : txt; }
调用时直接传控件即可,不需要额外传类型:
getText(txtSample); getText(lblSample); getText(chkSample);
这个方案更安全,所有逻辑在编译期就能完成校验,不会出现反射带来的运行时异常问题。
内容的提问来源于stack exchange,提问作者jonesong
相关产品推荐
相关产品推荐

