2016-07-03 5 views
0

Ich habe eine Button über FXML und zugehörige ein onAction() MethodeJavaFX schließen Dialog ohne Ergebnis Einstellung

<Button fx:id="cancelButton" cancelButton="true" mnemonicParsing="false" onAction="#cancelButtonAction" text="Cancel" /> 

Der Button eine Dialog schließen sollte, aber da es sich um eine Schaltfläche Abbrechen ist möchte ich nicht um ein Ergebnis setzen. Mein Problem ist, dass der Dialog nicht geschlossen wird, wenn ich kein Ergebnis einstelle.

Dialog<String> dialog = new Dialog<>(); 

public void cancelButtonAction(){ 
    System.out.println("cancel"); // this get's called 
    // dialog.setResult("foo"); // not working without this line 
    dialog.close();    // does not close the dialog 
} 

Wie kann ich den Dialog schließen, ohne ein Ergebnis zu setzen?

+0

Gibt es einen Grund, warum Sie den Button über FXML und nicht über 'Dialog's' createButton' erzeugen? Sehen Sie sich "Abschlussregeln für den Dialog" am Ende der [Dokumentation] an (https://docs.oracle.com/javase/con/Dialog.html) – Itai

Antwort

0

Dies wird höchstwahrscheinlich durch den Dialog Regeln verursacht, die hier beschrieben werden: Dialogue

diese Regeln im Einzelnen:

1. Wenn ein Dialog abnormal geschlossen ist, und wenn der Dialog enthält eine Schaltfläche , die eines der beiden obigen Kriterien erfüllt, versucht der Dialog die Ergebniseigenschaft auf den Wert festzulegen, der beim Aufruf des Ergebniskonverters mit dem ersten übereinstimmenden ButtonType zurückgegeben wird.

2. Wenn aus irgendeinem Grunde das Ergebnis Wandler null zurück, oder wenn das Dialog geschlossen ist, wenn nur ein Nicht-Löschtaste vorhanden ist, wird das Ergebnis Eigenschaft null sein, und die showAndWait() Methode kehrt Optional.empty(). Dieser spätere Punkt bedeutet, dass, wenn Sie entweder die Option Option 2 oder Option 3 (wie in dieser Dokumentation zuvor beschrieben) Dokumentation verwendet werden, wird der Optional.ifPresent (java.util.function.Consumer) Lambda nie aufgerufen und Code wird weiter ausgeführt, als ob der Dialog überhaupt keinen Wert zurückgegeben hat.

3. JavaFX Dialoge können nur ‚abnormal‘ geschlossen werden (wie oben definiert) in zwei Situationen: Wenn der Dialog nur eine Taste, oder wenn der Dialog hat mehr Tasten, solange einer von ihnen erfüllt eine der folgenden Anforderungen : Die Schaltfläche verfügt über einen ButtonType, dessen ButtonData vom Typ ButtonData.CANCEL_CLOSE ist. Die Schaltfläche verfügt über einen ButtonType, dessen ButtonData True zurückgibt, wenn ButtonData.isCancelButton() aufgerufen wird.

Vielleicht versuchen, wenn Sie nur schnell das Problem, wenn es nicht kritisch wollen beheben:

dialog.setResult(null); 
//Or this just to keep it simple 
dialog.setResult(""); 

Erwähnt auf einem Pfosten here Es ist möglich, nur eine cancel_close Taste fügen Sie diese zu beheben:

Hier
dialog.getDialogPane().getButtonTypes().add(new ButtonType("Cancel", ButtonData.CANCEL_CLOSE)); 
// or as jorn said you can simple do this : 
dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL); 

ist ein vollständiges Beispiel:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ButtonType; 
import javafx.scene.control.Dialog; 
import javafx.stage.Stage; 


public class JavaFXApplication2 extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     Button openDialog = new Button("Open Dialog"); 
     openDialog.setOnAction(event -> { 
      Dialog dialog = new Dialog(); 
      dialog.getDialogPane().getButtonTypes().add(ButtonType.CANCEL); 
      dialog.setContentText("Example"); 
      dialog.showAndWait(); 
     }); 

     stage.setScene(new Scene(openDialog)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+2

Zum Schluss Zeile, Sie könnten auch ['' 'ButtonType.CANCEL'''' verwenden (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ButtonType.html#CANCEL). –

+0

Gültiger Punkt :) Ich habe nur aus dem anderen Beitrag zitiert ich für das verlinkt :) – D3181

+0

Aktualisiert, um ein Beispiel für @Jorn Lösung enthalten – D3181

Verwandte Themen