То, что должно было быть прямым, быстро пошло вниз.
До сих пор я пробовал все связанные с onAction вопросы о stackOverflow, дважды и трижды проверял их на наличие опечаток, и даже упал до уровня поиска в / r / javahelp от Reddit, но, увы, я уступил.
Мы с другом работаем над сетевым текстовым редактором в качестве доказательства концепции / проекта для домашних животных, и, хотя я изо всех сил пытаюсь обернуть его вокруг сетевой стороны, я пытаюсь помочь, добавив скин -глубокие разделы, такие как этот хлопотный экран настроек. Все, что я хочу сделать, это дать пользователю диалоговое окно, позволяющее ему сменить тему, которое затем загрузится в новый лист CSS.
У меня есть следующие файлы:
SettingsTools.java
public class SettingsTools {
String ret = null;
Stage stage;
Parent root;
Scene scene;
SettingsController sc = new SettingsController();
public void changeTheme() {
stage = new Stage();
root = ApplicationTools.loadFromFXML("/fxml/settings.fxml", sc);
scene = new Scene(root, 350, 350);
stage.setScene(scene);
stage.setTitle("Settings");
stage.showAndWait();
}
public String showSettings() {
changeTheme();
return sc.getData();
}
}
settings.fxml
<GridPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/10.0.1" >
<columnConstraints>
<ColumnConstraints minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" />
<RowConstraints minHeight="10.0" prefHeight="30.0" />
<RowConstraints minHeight="10.0" prefHeight="30.0" />
</rowConstraints>
<children>
<RadioButton id="light" selected="true" text="Light">
<toggleGroup>
<ToggleGroup fx:id="t" />
</toggleGroup>
</RadioButton>
<RadioButton id="dark" text="Dark" toggleGroup="$t" GridPane.rowIndex="1" />
<Button text="Accept"
GridPane.columnIndex="1"
GridPane.rowIndex="2"
fx:id="accept"
onAction="#acceptButton"/>
<Button text="Cancel"
GridPane.rowIndex="2"
fx:id="cancel"
onAction="#cancelButton"/>
</children>
</GridPane>
SettingsController.java
public class SettingsController {
String ret = null;
Stage stage;
Parent root;
Scene scene;
@FXML
Button accept;
@FXML
Button cancel;
@FXML
RadioButton dark;
@FXML
RadioButton light;
@FXML
protected void acceptButon() {
if (light.isSelected()) {
ret = "light";
} else if (dark.isSelected()) {
ret = "dark";
}
Stage stage = (Stage) accept.getScene().getWindow();
stage.close();
}
@FXML
protected void cancelButton(ActionEvent event) {
ret = null;
stage.close();
}
public String getData() {
return ret;
}
}
ApplicationTools.java (это только для справки)
public static <T> T loadFromFXML(String path, Object controller) {
T root;
// Attempt to load FXML file
try {
FXMLLoader loader = new FXMLLoader();
URL location = ApplicationTools.class.getResource(path);
loader.setLocation(location);
if(controller != null) {
loader.setController(controller);
}
root = loader.load();
} catch (Exception e) {
// FXML file load failed, return error scene instead
System.err.format("Failed loading FXML file at path: '%s':\n" + e.getMessage(), path);
VBox t_root = new VBox();
t_root.getChildren().add(new Label("Failed loading FXML file at path: '" + path + "':\n" + e.getMessage()));
root = (T) t_root;
}
return root;
}
Когда пользователь выбирает, что он хочет просмотреть экран настроек, создается новый экземпляр SettingsTools, а затем вызывается showSettings () для него. Весь смысл того, чего я сейчас пытаюсь достичь, - это вернуть строку, основанную на выбранной опции. Я знаю, что все настройки показа вызова в теме изменения вызова не нужны, но сделали так, чтобы ограничить будущие изменения, когда потребуется больше настроек.
По какой-то причине FXML / JavaFX не допускает onAction = "acceptButton", но все ответы Google относятся к опечаткам и т. Д.