8

整数と文字列のプロパティをバインドしようとしました。グーグルで調べた後、提供されている2つの方法のいずれかでこれが可能になるはずです。

  1. public static void bindBidirectional(プロパティ stringProperty,
    プロパティ otherProperty, StringConverter コンバーター)

  2. public static void bindBidirectional(プロパティ stringProperty,
    プロパティ otherProperty, java.text.Format format)

残念ながら、これは私にはうまくいかないようです。私は何を間違っていますか?

import java.text.Format;

import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.util.converter.IntegerStringConverter;

public class BiderectionalBinding {

    public static void main(String[] args) {
        SimpleIntegerProperty intProp = new SimpleIntegerProperty();
        SimpleStringProperty textProp = new SimpleStringProperty();

        Bindings.bindBidirectional(textProp, intProp, new IntegerStringConverter());

        intProp.set(2);
        System.out.println(textProp);

        textProp.set("8");
        System.out.println(intProp);    
    }
}
4

4 に答える 4

3

同様の問題がありました。文字列を File-Object に変換して元に戻そうとしました。しかし、私は Bindings.bindBidirectional(...,...,java.text.Format) を使用しました。文字列からファイルへの変換は期待どおりに機能しましたが、逆方向の結果は null でした。私はあなたの例で試しましたが、同じ結果です! バインディング メカニズムにバグがあるか、java.text.Format の実装が間違っている可能性があります。

package de.ludwig.binding.model;

import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;

import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;

public class BidirectionalBinding {

    public static void main(String[] args) {
        SimpleIntegerProperty intProp = new SimpleIntegerProperty();
        SimpleStringProperty textProp = new SimpleStringProperty();

        Bindings.bindBidirectional(textProp, intProp, new Format() {

            @Override
            public StringBuffer format(Object obj, StringBuffer toAppendTo,
                    FieldPosition pos) {
                return toAppendTo.append(obj.toString());
            }

            @Override
            public Object parseObject(String source, ParsePosition pos) {
                return Integer.parseInt(source);
            }

        });

        intProp.set(2);
        System.out.println(textProp);

        textProp.set("8");
        System.out.println(intProp);    
    }
}

期待どおりに動作させる唯一の方法は、Hendrik Ebbers の推奨に従って StringConverter を実装することでした。このヒントをありがとう!

于 2013-03-25T13:48:35.390 に答える
3

Eclipse でコードを試してみたところ、コンバーターをキャストする必要がありました。その後、すべてが正常に見えます:

public class BiderectionalBinding {

    public static void main(String[] args) {
        SimpleIntegerProperty intProp = new SimpleIntegerProperty();
        SimpleStringProperty textProp = new SimpleStringProperty();
        StringConverter<? extends Number> converter =  new IntegerStringConverter();

        Bindings.bindBidirectional(textProp, intProp,  (StringConverter<Number>)converter);

        intProp.set(2);
        System.out.println(textProp);

        textProp.set("8");
        System.out.println(intProp);    
    }
}

出力は次のとおりです。

StringProperty [値: 2]

IntegerProperty [値: 8]

于 2013-01-03T12:27:20.690 に答える
0

それはバグだと思います。とにかく、次のような回避策があります。

StringConverter sc = new IntegerStringConverter();
Bindings.bindBidirectional(textProp, intProp, sc);
于 2013-01-03T12:10:54.420 に答える