将JavaFX TextField绑定到两个SimpleStringValues的String值

时间:2014-06-09 17:53:04

标签: java user-interface javafx textfield java-8

我有三个JavaFX TextField,一个用于名称,一个用于域,最后一个用于FQDN(完全限定域名)。

我有一个包含名称,域和FQDN的SimpleStringProperties的类。我无法为FQDN创建绑定,该绑定采用SimpleStringProperty name和SimpleStringProperty域中设置的值并创建SimpleStringProperty name @ domain。我试图通过组合名称和域并添加@来构建字符串但是我无法将其返回到SimpleStringProperty以发送到FQDN的GUI。

我已经包含了我所做的一个粗略的例子。我有GUI和许多其他组件工作,我只是无法让FQDN正确报告。

我之前在Java Swing中做过这个,通过添加一个ActionListener来监听鼠标移动,然后更新字段。我正在努力改进这一点。

public class Data {
static SimpleStringProperty name = new SimpleStringProperty();
static SimpleStringProperty domain = new SimpleStringProperty();
static SimpleStringProperty FQDN = new SimpleStringProperty();

public static void setName(String string) {
    name.set(string);
}

public static void setDomain(String string) {
    domain.set(string);
}

public static ObservableStringValue getFQDN() {
    FQDN.set(name.get() + "@" + domain.get());
    return FQDN;
}

}

public class GUI {
TextField name = new TextField();
TextField domain = new TextField();
TextField FQDN = new TextField();

name.textProperty().addListener(new NameChange());
domain.textProperty().addListener(new DomainChange());
FQDN.textProperty().bind(Data.getFQDN());
}

public class NameChange implements ChangeListener<String> {

@Override
public void changed(ObservableValue<? extends String> observable, 
                                                          String oldValue, 
                                                          String newValue) {
    Data.setName(newValue);
}

}

public class DomainChange implements ChangeListener<String> {

@Override
public void changed(ObservableValue<? extends String> observable,
                                                     String oldValue, 
                                                     String newValue) {
    Data.setDomain(newValue);
}

}

1 个答案:

答案 0 :(得分:6)

无法真正理解为什么你会将Data类中的所有内容设为静态,但是:

public class Data {
static StringProperty name = new SimpleStringProperty();
static StringProperty domain = new SimpleStringProperty();
static StringProperty FQDN = new SimpleStringProperty();

static {
    FQDN.bind(Bindings.format("%s@%s", name, domain));
}

public static String setName(String string) {
    name.set(string);
}

public static String setDomain(String string) {
    domain.set(string);
}

public static ObservableStringValue getFQDN() {
    return FQDN;
}
}