2016-06-06 5 views
2

Я создал простой диалог с кнопками радиоПреобразование результата из FXML диалога

<?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> 

И я создаю это так:

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); 
    } 
} 

Но сейчас я хотел бы не возвращаться «A «все время, но« A », если выбрано« Comment »,« B », если выбрано« Survey »и т. д.

Как это сделать?

ответ

3

Так у вас есть контроллер: myapp.AddDialogController и в том, что вы определили @FXML ToggleGroup #myToggleGroup. Поэтому контроллер знает о группе переключения, связанной с переключателями в вашем диалоговом окне.

Вместо использования статической функции загрузки FXMLLoader вместо этого создайте новый FXMLLoader и используйте из него (нестатические) функции загрузки. Как только вы это сделаете, вы можете получить ссылку на контроллер из экземпляра загрузчика. Методика получения контрольной ссылки от контроллера показана в ответе на: Passing Parameters JavaFX FXML.

Как только у вас есть ссылка на ваш контроллер, вы можете передать это в качестве дополнительного параметра вашей функции convertDialogResult. В этой функции вместо того, чтобы просто возвращать символ A, вы можете вместо этого возвратить сопоставление из выбранного переключателя в группе переключателей (что вы узнаете, запросив новый метод, который вы добавляете в контроллер getSelectedToggle) в строку, которую вы хотите (например, "Комментарий"). Вам даже не нужно поддерживать сопоставление в коде, если достаточно просто вызвать getText() на выбранной кнопке переключения.


Однако, в конце концов, я думаю, что предпочтительный вариант, а не экстернализации некоторых из диалоговой логики от контроллера, как вы сделали, был бы вместо того, чтобы инкапсулировать некоторые из логики внутри контроллера, аналогичного ниже :

MyApp/дополнения 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

Вы уже пробовали это: 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 

     } 

    } 
});