Ich sehe keinen gültigen Grund dafür: Sie fordern im Grunde, dass ein Controller Benutzerereignisse in der Ansicht aufruft, anstatt das zu tun, was er normalerweise tut, und das Modell zu aktualisieren.
Also ich denke, das nächste, was ich mir vorstellen könnte, wäre so etwas. Angenommen, Sie hatten (die kanonische JavaFX Beispiel verwendet wird), eine Person
Klasse:
public class Person {
private final StringProperty firstName = new SimpleStringProperty() ;
private final StringProperty lastName = new SimpleStringProperty() ;
private final StringProperty email = new SimpleStringProperty() ;
public StringProperty firstNameProperty() {
return firstName ;
}
public final String getFirstName() {
return firstNameProperty().get();
}
public final void setFirstName(String firstName) {
firstNameProperty().set(firstName);
}
// etc etc
}
und dann in irgendeiner Form einen Editor. Sie können im Editor eine Zuordnung erstellen, die jedes Textfeld einer auszuführenden Aktion zuordnet, und dann einen einzelnen Ereignishandler für jedes Textfeld registrieren, das die entsprechende Aktion aufruft. Ihre Taste könnte durch die Karte iterieren und alle Aktionen aufrufen:
public class PersonEditor {
private TextField firstNameTextField ;
private TextField lastNameTextField ;
private TextField emailTextField ;
private Button okButton ;
public PersonEditor(Person person) {
// create controls, do layout, etc etc...
// map textfields to an action on the person:
Map<TextField, Consumer<String>> actions = new HashMap<>();
actions.put(firstNameTextField, person::setFirstName);
actions.put(lastNameTextField, person::setLastName);
actions.put(emailTextField, person::setEmail);
// set individual event handlers on each text field:
actions.entrySet().forEach(entry -> {
TextField tf = entry.getKey();
tf.setOnAction(e -> entry.getValue().accept(tf.getText()));
});
// event handler for button:
okButton.setOnAction(e -> {
// invoke action on each text field:
actions.entrySet().forEach(entry -> entry.getValue().accept(entry.getKey().getText()));
// do other stuff if needed...
}
}
}
Anstatt das Ereignis manuell von Brennen, machen Sie Ihre Taste eine Standardschaltfläche durch seinen Aufruf [setDefaultButton] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ Button.html # setDefaultButton-boolean-) Methode. – VGR
Ich habe '.fireEvent (new ActionEvent())' benutzt, um meinen 'TextField's Action Handler auszulösen. Ich musste jedoch jedes 'TextField' durchlaufen und' fireEvent' aufrufen. Ich habe noch nie zuvor einen 'Button' benutzt. Ich schätze es ist die Möglichkeit eines Starts. –
@MichaelPickett Du kannst es als Antwort hinzufügen :) – GOXR3PLUS