Java报错:String类无法解析setVisible方法(JavaFX场景)
解决JavaFX中discountCode.setVisible()报错的问题
你遇到的问题是:调用discountCode.setVisible(true);时提示无法在String类型上找到setVisible方法,但discountAmount.setVisible(true);能正常执行。
问题根源
你的applyDiscount方法参数名discountCode,和FXML注入的Text控件变量名完全重复。在方法内部,局部变量(方法参数)的优先级高于类成员变量,所以代码里的discountCode被识别为传入的String类型参数,而非你要操作的Text控件,自然调用不了控件的setVisible方法。
两种解决办法
方法1:修改方法参数名
把方法的参数名改成和控件变量不重复的名字,比如userDiscountCode,这样方法内就能正确引用到FXML注入的Text控件:
public void applyDiscount(String userDiscountCode){ if("SALE10".equals(userDiscountCode)){ BigDecimal preDiscount = new BigDecimal(subtotalSum.getText().substring(1)); BigDecimal discountAmountValue = preDiscount.multiply(new BigDecimal("0.10")); BigDecimal newSubtotal = preDiscount.subtract(discountAmountValue); subtotalSum.setText("$" + newSubtotal.setScale(2, RoundingMode.HALF_UP)); BigDecimal taxRate = new BigDecimal("0.12"); BigDecimal newTotalPrice = newSubtotal.multiply(BigDecimal.ONE.add(taxRate)); totalPrice.setText("$" + newTotalPrice.setScale(2, RoundingMode.HALF_UP)); discountAmount.setText("-$" + discountAmountValue.setScale(2, RoundingMode.HALF_UP)); discountCode.setVisible(true); discountAmount.setVisible(true); } else { discountCode.setVisible(false); discountAmount.setVisible(false); // 无效码保持隐藏 } }
方法2:使用this关键字明确引用类成员变量
如果不想修改参数名,就在调用控件方法时加上this.,明确指定要操作的是类成员变量(FXML注入的控件),而非方法参数:
public void applyDiscount(String discountCode){ if("SALE10".equals(discountCode)){ BigDecimal preDiscount = new BigDecimal(subtotalSum.getText().substring(1)); BigDecimal discountAmountValue = preDiscount.multiply(new BigDecimal("0.10")); BigDecimal newSubtotal = preDiscount.subtract(discountAmountValue); subtotalSum.setText("$" + newSubtotal.setScale(2, RoundingMode.HALF_UP)); BigDecimal taxRate = new BigDecimal("0.12"); BigDecimal newTotalPrice = newSubtotal.multiply(BigDecimal.ONE.add(taxRate)); totalPrice.setText("$" + newTotalPrice.setScale(2, RoundingMode.HALF_UP)); discountAmount.setText("-$" + discountAmountValue.setScale(2, RoundingMode.HALF_UP)); this.discountCode.setVisible(true); // 用this.指向控件变量 discountAmount.setVisible(true); } else { this.discountCode.setVisible(false); discountAmount.setVisible(false); // 无效码保持隐藏 } }
额外注意
确保你的控制器类中已经正确注入了FXML控件,声明如下:
@FXML private Text discountCode; @FXML private Text discountAmount;
内容的提问来源于stack exchange,提问作者Cyrus
相关产品推荐
相关产品推荐

