То, что должно было быть прямым, быстро пошло под откос.
До сих пор я пробовал все вопросы, связанные с onAction, по stackOverflow, дважды и трижды проверял на наличие опечаток и даже упал до уровня поиска на Reddit / r / javahelp, но, увы, я уступил.
Мы с другом работаем над сетевым текстовым редактором в качестве доказательства концепции / проекта питомца, и пока я изо всех сил пытаюсь осмыслить его сетевую сторону, я пытаюсь быть полезным, добавляя тонкие разделы , например, этот неприятный экран настроек. Все, что я хочу сделать, это дать пользователю диалоговое окно, в котором можно изменить тему, которая затем загрузится в новый лист 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 касаются опечаток и т. д.
У вас когда-нибудь был один из тех дней, когда, как бы вы ни старались, вы всегда попадаете в ситуацию, когда вам просто нужно «ну почему я такой чертов дурак»? Да, я тоже




У вас опечатка: protected void acceptButon () -> acceptButton ()