2017-01-10 5 views
0

weiß, dass ich einige Möglichkeiten, wie das Hinzufügen von denselben in actionhandler verschiedenen Knoten zu vermeiden:JavaFX Fire TextField ActionEvent manuell | programmatisch

 // Custom Event Handler 
     EventHandler<ActionEvent> myHandler = e -> { 

      //code 

     }; 

     inputField.setOnAction(myHandler); 

     // okButton 
     okButton.setOnAction(myHandler); 

Aber ich eine Methode fireEvent(Event) innerhalb der Knoten class.The Problems sehen kann, ist, dass ich mehr TextFields und wenn die Button genannt habe okButton ist gedrückt, ich möchte sie alle auf einmal feuern.

Wie kann das gemacht werden? Wenn es nicht etwas ist, das dir nicht viel Sinn macht, sag, dass ich es aus Forschungsgründen will :).

+1

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

+1

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. –

+0

@MichaelPickett Du kannst es als Antwort hinzufügen :) – GOXR3PLUS

Antwort

1

Wie von OP angefordert, füge ich meinen Kommentar als Antwort hinzu.

Sie können .fireEvent(new ActionEvent()) verwenden, um den Aktionshandler TextField auszulösen.

Die Art, die ich erreicht habe, war durch Speichern/Abrufen aller TextField s, wenn dann, wenn eine Button gedrückt wird, iterieren über alle und .fireEvent(new ActionEvent());. Kleines Controller-Beispiel unten. VBox stammt aus einer FXML-Datei.

public class Controller { 

    @FXML private VBox root; 
    private List<TextField> all = new ArrayList<>(); 

    public Controller(){} 
    @FXML 
    public void initialize(){ 
     EventHandler<ActionEvent> customEvent = e -> { 
      if(e.getSource().getClass() == Button.class){ 
       all.forEach(t -> t.fireEvent(new ActionEvent())); 
      }else { 
       System.out.println(((TextField) e.getSource()).getText()); 
      } 
     }; 

     for(int i=0; i < 10; i++){ 
      TextField tf = new TextField(Integer.toString(i)); 
      tf.setOnAction(customEvent); 
      all.add(tf); 
      root.getChildren().add(tf); 
     } 
     Button btn = new Button(); 
     btn.setOnAction(customEvent); 
     root.getChildren().add(btn); 
    } 

} 
2

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... 
     } 

    } 

} 
Verwandte Themen