Так у вас есть контроллер: 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);
}
}