2016-06-06 9 views
2

Ich habe einen einfachen Dialog mit Radio-ButtonsConverting das Ergebnis eines FXML Dialog

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.net.*?> 
<?import javafx.geometry.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.text.*?> 
<?import javafx.scene.image.*?> 
<?import javafx.scene.image.Image?> 


<Dialog fx:id="dialog" 
    fx:controller="myapp.AddDialogController" 
    xmlns:fx="http://javafx.com/fxml"> 
    <dialogPane> 
     <DialogPane prefWidth="400.0" prefHeight="300.0"> 
      <stylesheets> 
       <URL value="@/css/styles.css" /> 
      </stylesheets> 
      <content> 
       <VBox> 
        <fx:define> 
         <ToggleGroup fx:id="myToggleGroup"/> 
        </fx:define> 
        <children> 
         <RadioButton text="Comment" toggleGroup="$myToggleGroup"/> 
         <RadioButton text="Survey" toggleGroup="$myToggleGroup"/> 
         <RadioButton text="Suggestion" toggleGroup="$myToggleGroup"/> 
        </children> 
       </VBox> 
      </content> 
     </DialogPane> 
    </dialogPane> 
</Dialog> 

Und ich schaffe es wie folgt aus:

private String convertDialogResult(ButtonType buttonType) { 
    if (buttonType == ButtonType.OK) { 
     return "A"; 
    } else { 
     return null; 
    } 
} 

private Dialog<String> createAddDialog() throws ApplicationException { 

    try { 
     Dialog<NodeViewModel> dialog = FXMLLoader.load(getClass().getResource("/fxml/add_dialog.fxml")); 

     dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL); 
     dialog.setResultConverter(this::convertDialogResult); 

     return dialog; 
    } catch (IOException e) { 
     throw new ApplicationException(e); 
    } 
} 

Aber jetzt würde Ich mag nicht „A zurückzukehren "die ganze Zeit, aber" A ", wenn" Kommentar "ausgewählt ist," B ", wenn" Vermessung "ausgewählt ist usw.

Wie kann ich das tun?

Antwort

3

So haben Sie einen Controller: myapp.AddDialogController und dass Sie @FXML ToggleGroup #myToggleGroup definiert haben. Der Controller kennt also die Umschaltgruppe, die den Optionsfeldern in Ihrem Dialogfeld zugeordnet ist.

Anstatt die statische FXMLLoader-Ladefunktion zu verwenden, erstellen Sie stattdessen einen neuen FXMLLoader und verwenden Sie eine (nicht statische) Ladefunktion. Sobald Sie dies getan haben, können Sie einen Verweis auf den Controller aus der Loader-Instanz erhalten. Die Technik zum Abrufen der Controller-Referenz von der Steuerung wird in der Antwort auf: Passing Parameters JavaFX FXML gezeigt. Wenn Sie einen Verweis auf Ihren Controller haben, können Sie diesen als zusätzlichen Parameter an Ihre convertDialogResult-Funktion übergeben. In dieser Funktion können Sie anstatt nur das Zeichen A zurückzugeben, stattdessen ein Mapping vom ausgewählten Toggle in der Toggle-Gruppe (die Sie durch Abfragen einer neuen Methode, die Sie zu Controller getSelectedToggle hinzufügen) an den gewünschten String zurückgeben "Kommentar"). Sie müssen nicht wirklich eine Zuordnung in Code beibehalten, wenn es ausreicht, nur getText() auf der ausgewählten Umschaltfläche aufzurufen.


jedoch am Ende, denke ich, die bevorzugte Option, anstatt einen Teil der Dialoglogik von der Steuerung Externalisierung, wie Sie getan haben, wäre stattdessen einen Teil der Logik in der Steuerung auf unter ähnlich einzukapseln :

myapp/Add-dialog.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.VBox?> 

<Dialog fx:id="dialog" 
     fx:controller="myapp.AddDialogController" 
     xmlns:fx="http://javafx.com/fxml"> 
    <dialogPane> 
    <DialogPane prefWidth="400.0" prefHeight="300.0"> 
     <content> 
     <VBox> 
      <fx:define> 
      <ToggleGroup fx:id="myToggleGroup"/> 
      </fx:define> 
      <RadioButton text="Comment" toggleGroup="$myToggleGroup"/> 
      <RadioButton text="Survey" toggleGroup="$myToggleGroup"/> 
      <RadioButton text="Suggestion" toggleGroup="$myToggleGroup"/> 
     </VBox> 
     </content> 
    </DialogPane> 
    </dialogPane> 
</Dialog> 

myapp/AddDialogController.java

package myapp; 

import javafx.beans.binding.Bindings; 
import javafx.fxml.FXML; 
import javafx.scene.Node; 
import javafx.scene.control.*; 

public class AddDialogController { 
    @FXML private ToggleGroup myToggleGroup; 
    @FXML private Dialog<String> dialog; 

    public void initialize() { 
     dialog.getDialogPane().getButtonTypes().addAll(
       ButtonType.OK, ButtonType.CANCEL 
     ); 

     Node okButton = dialog.getDialogPane().lookupButton(ButtonType.OK); 
     okButton.disableProperty().bind(
       Bindings.isNull(
         myToggleGroup.selectedToggleProperty() 
       ) 
     ); 

     dialog.setResultConverter(this::convertDialogResult); 
    } 

    private String convertDialogResult(ButtonType buttonType) { 
     if (ButtonType.OK.equals(buttonType)) { 
      return getSelectedToggleValue(); 
     } else { 
      return null; 
     } 
    } 

    private String getSelectedToggleValue() { 
     RadioButton selectedRadio = (RadioButton) myToggleGroup.getSelectedToggle(); 

     if (selectedRadio == null) { 
      return null; 
     } 

     return selectedRadio.getText(); 
    } 
} 

myapp/DialogDisplayApp.java

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

import java.io.IOException; 

public class DialogDisplayApp extends Application { 

    @Override 
    public void start(Stage stage) throws IOException { 
     FXMLLoader loader = new FXMLLoader(
       getClass().getResource(
         "add-dialog.fxml" 
       ) 
     ); 

     stage.setScene(new Scene(new VBox(new Label("Main Window")), 600, 400)); 
     stage.show(); 

     Dialog<String> dialog = loader.load(); 

     dialog.initOwner(stage); 
     dialog.showAndWait(); 

     System.out.println(dialog.getResult()); 
    } 

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

Haben Sie das schon versucht: get-selected-radio-button-from-togglegroup

group.selectedToggleProperty().addListener(new ChangeListener<Toggle>(){ 
    public void changed(ObservableValue<? extends Toggle> ov, Toggle old_toggle, Toggle new_toggle) { 

     if (group.getSelectedToggle() != null) { 

      System.out.println(group.getSelectedToggle().getUserData().toString()); 
      // Do something here with the userData of newly selected radioButton 

     } 

    } 
}); 
Verwandte Themen