【问题标题】:JTextField BeansBindingJTextField BeansBinding
【发布时间】:2011-09-21 15:18:57
【问题描述】:

我有 2 个名为“数量”和“金额”的 JtextField。当用户输入 qty 时,该值会在某些计算下消失,并将最后一个值设置为数量文本字段。我已将这两个文本字段绑定到 beansbinding 类的属性。当用户输入 qty 时,会调用负责该文本字段的属性,然后我调用了 qty 的 firepropertychange 以及金额的 firepropertychange 以根据 qty 更新金额的值。这很好用。此外,当使用退格按钮删除 qty 的文本字段的值时,qty 的值也会改变。但是当 qty 文本字段为空时,数量文本字段保持其最后一个值(假设 qty 有一个数字“22”和数量文本字段显示'44',当按下退格键时,数字为'2',数量的显示值为'4',但当数量中的最后一个值'2'被删除时,数量文本字段显示'4')。我想要金额文本字段应显示为零。

请问有什么解决办法吗?

【问题讨论】:

  • 听起来像转换字符串 --> 数字不能处理空/空输入(大多数格式化程序不能,你必须告诉他们或你的转换器接受 0)
  • 我对 beansbinding 还是很陌生。您能通过示例转换器类告诉我如何做到这一点吗?
  • 我的想法是,当 JTextField 中没有任何字符时(之前有一些字符时),JtextField 的值是“”不为空或为空。这就是我的想法而不是知道确切的原因。
  • 好吧,"" 是空字符串 :-) 将 null 和空字符串都映射到零并开心...

标签: swing desktop-application beans-binding


【解决方案1】:

刚刚检查了默认转换器:它们不处理空/空,您必须实现一个可以做到的并将其设置为绑定。类似的,要查看区别,取消注释转换器设置:

@SuppressWarnings({ "rawtypes", "unchecked" })
private void bind() {
    BindingGroup context = new BindingGroup();
    AutoBinding firstBinding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE,
          // this is some int property
            this, BeanProperty.create("attempts"), 
            fields[0], BeanProperty.create("text"));
    context.addBinding(firstBinding);
    // firstBinding.setConverter(INT_TO_STRING_CONVERTER); 
    context.bind();
}

static final Converter<Integer, String> INT_TO_STRING_CONVERTER = new Converter<Integer, String>() {
    @Override
    public String convertForward(Integer value) {
        return Integer.toString(value);
    }

    @Override
    public Integer convertReverse(String value) {
        if (value == null || value.trim().length() == 0) return 0;
        return Integer.parseInt((String) value);
    }
};

【讨论】:

  • 感谢您的代码。我在我的应用程序中使用它。它工作得很好。非常感谢 :) 我在转换器中也遇到了另一个问题。我也可以用你的想法解决这个问题。很高兴:)