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

n0m*_*rmy 3 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;
}
Run Code Online (Sandbox Code Playgroud)

}

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);
}
Run Code Online (Sandbox Code Playgroud)

}

public class DomainChange implements ChangeListener<String> {

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

}

Jam*_*s_D 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;
}
}
Run Code Online (Sandbox Code Playgroud)