Lamdba auf EventHandler

Diskutiere Lamdba auf EventHandler im AWT, Swing, JavaFX & SWT Bereich.
S

Sandro95

Einen sguten Tag Leute ,
mir ist bewzusst wie man Lambdas implementiert und deren Nutzen. Nun stehe ich vor derAufgabe diesen EventHanlder mit einem Lambda zu modifizieren

"
// Eventhanlder für den Button neu

// neu.setOnAction(new EventHandler<ActionEvent>() {
//
// public void handle(ActionEvent e) {
// try {
// if (t1.getText() != null && t2.getText() != null) {
// bild.setTitel(t1.getText());
// bild.setOrt(t2.getText());
// bild.setJahr(Integer.parseInt(t3.getText()));
// stage.close();
// }
//
// } catch (NumberFormatException ee) {
// Label wrong = new Label(" Eingabe bitte Prüffen");
// box.getChildren().add(wrong);
// }
//
// }
// });

neu.setOnAction((ActionEvent e)->);


Das ich eine Exception in einem LAmbda habe ist mir dabei neu . Wie geht man bei sowas ran ?


mfg
 
J

JustNobody

Also eine Möglichkeit ist, einen Wrapper zu haben, der die Exception handhabt. Dann kannst Du den Lambda wie gewohnt schreiben nur eben muss es im Wrapper Aufruf sein (Sprich der Wrapper hat einen Consumer als Parameter, so dass da ein Lambda Ausdruck möglich ist).

Das Ganze wird z.B. unter https://www.baeldung.com/java-lambda-exceptions beschrieben.
 
S

Sandro95

@JustNobody , also kann man ein LmabdaWrapper erstellen ?
die ganze if abfrage packe ich dann aber nicht im Lambda doder ?Bei einem Lambda werden ja die ganzen schleifen , if abfragen nicht gezeigt das passiert ja mehr oder wenige im Hintergung?
 
H

httpdigest

Die Expression eines Lambdas kann auch ein Block-Statement sein:
Java:
neu.setOnAction(e -> {
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte Prüffen");
    box.getChildren().add(wrong);
  }
});
 
S

Sandro95

Die Expression eines Lambdas kann auch ein Block-Statement sein:
Java:
neu.setOnAction(e -> {
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte Prüffen");
    box.getChildren().add(wrong);
  }
});

aber die Lambdas dienen ja zur kürzung des code , was in diesem Fall nicht wirklich eintritt oder ?
 
J

JustNobody

Also erst einmal: Du kannst im Lambda ganze Codeblöcke haben:
Code:
neu.setOnAction(e -> {  // Hier brauchst Du den Typ nicht!
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte prüfen");
    box.getChildren().add(wrong);
  }
});
Aber solche Blöcke sind natürlich nicht wirklich lesbar.

Daher packt man sowas eher in eine Methode.
Code:
 protected void someAction(ActionEvent e) {
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte prüfen");
    box.getChildren().add(wrong);
  }
}

// Und dann einfach eine Methodenreferenz nutzen:
neu.setOnAction(this::someAction);
Das wäre dann etwas, wie ich es wohl bauen würde.

Die Idee eines ExceptionHandlers ist mehr dazu da, dass man dann etwas machen kann, das auch Exceptions wirft.

Dann hätte man sowas wie:

Code:
neu.setOnAction(myExceptionHandlerMethod(() -> {....} );
Das macht aber aus meiner Sicht nur Sinn, wenn man einfache Aufrufe hat. Also keinen Block Code, denn der wird immer schnell unlesbar.
 
S

Sandro95

Also erst einmal: Du kannst im Lambda ganze Codeblöcke haben:
Code:
neu.setOnAction(e -> {  // Hier brauchst Du den Typ nicht!
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte prüfen");
    box.getChildren().add(wrong);
  }
});
Aber solche Blöcke sind natürlich nicht wirklich lesbar.

Daher packt man sowas eher in eine Methode.
Code:
 protected void someAction(ActionEvent e) {
  try {
    if (t1.getText() != null && t2.getText() != null) {
      bild.setTitel(t1.getText());
      bild.setOrt(t2.getText());
      bild.setJahr(Integer.parseInt(t3.getText()));
      stage.close();
    }
  } catch (NumberFormatException ee) {
    Label wrong = new Label(" Eingabe bitte prüfen");
    box.getChildren().add(wrong);
  }
}

// Und dann einfach eine Methodenreferenz nutzen:
neu.setOnAction(this::someAction);
Das wäre dann etwas, wie ich es wohl bauen würde.

Die Idee eines ExceptionHandlers ist mehr dazu da, dass man dann etwas machen kann, das auch Exceptions wirft.

Dann hätte man sowas wie:

Code:
neu.setOnAction(myExceptionHandlerMethod(() -> {....} );
Das macht aber aus meiner Sicht nur Sinn, wenn man einfache Aufrufe hat. Also keinen Block Code, denn der wird immer schnell unlesbar.

in der Aufgabe steht , ich soll die bisherigen EventHandler mit Lambdas modifizeiren also geht die Option mit der Methode erstellen ja nicht .
 
mihe7

mihe7

in der Aufgabe steht , ich soll die bisherigen EventHandler mit Lambdas modifizeiren also geht die Option mit der Methode erstellen ja nicht .
Warum sollte das nicht gehen? Allerdings enthält neu.setOnAction(this::someAction) kein Lambda, sondern eine Methodenreferenz. Mit Lambda wäre das neu.setOnAction(e -> someAction(e));
 
S

Sandro95

Warum sollte das nicht gehen? Allerdings enthält neu.setOnAction(this::someAction) kein Lambda, sondern eine Methodenreferenz. Mit Lambda wäre das neu.setOnAction(e -> someAction(e));

ja so habe ich das ja auch schon oben am bei meiner Frage gemacht . nur weiß ich halt nich twie ich das genau mit der Exception in dem eig. Eventhandler mache . wie ich die Exception im Ausdruck miteinbeziehe
 
J

JustNobody

Wenn Du einen Code-Block hast, dann funktioniert das genau so wie immer. Wenn Du die Exception nicht im Code-Block behandeln willst, dann ginge noch der Lambda Wrapper, der die Exception fängt und behandelt...

Ansonsten muss ich gestehen, dass ich nicht ganz Dein Problem verstehe - evtl. kannst Du ja noch mit mehr Details schildern, was Dein konkretes Problem ist.
 
S

Sandro95

Ich soll meine GUI die EventHandler als Lambda Ausdrucke imolementieren ( die EventHandler davor waren easy weil dort keien Exception drin waren) . So jetzt wie oben am Anfang beschrieben ist in dem EventHandler eine Exception und ich weiß nicht wirklich wie ich diese als Lambda modifizieren soll.
aufgabenblatt ist im anhang.

@JustNobody
 

Anhänge

J

JustNobody

Aber dann ist es doch wie in #6 zuerst geschrieben: einfach ein Lambda Ausdruck, der halt dann einen ganzen Block bekommt.

Was stört Dich an dieser Variante (außer, dass so Blöcke in Lambda-Ausdrücken unleserlich sind und daher eher vermieden werden sollten ... hier ist es ja explizit gefordert.

Oder eben man packt es in eine Methode und ruft diese dann per Lambda Ausdruck auf wie @mihe7 in #8 aufgezeigt hat ...
 
S

Sandro95

also wäre die Option vollkommen okay ? das ganze im einen größeren Block zu packen ?
Das mit de Exception hat mich durcheinander gebracht sorry..
 
Thema: 

Lamdba auf EventHandler

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben