Добрый день всем. Я обычно пытаюсь найти и исправить ошибки самостоятельно, но на этот раз я застрял по-настоящему. Моим заданием было написать кредитный калькулятор. Весь код работал и компилировался очень хорошо, пока я не дошел до того, что мне нужно было создать линейную диаграмму / график, которая появляется в новом окне. Проблема заключается в загрузке файлов F XML или подключении дополнительных контроллеров к главному контроллеру. Я пробовал разные подходы и проверял решение на разных форумах, но не смог внедрить его в свой код. Кто-нибудь может предложить мне решение?
Вот мой Main, который запускает программу.
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Scene.fxml"));
primaryStage.setTitle("Loan calculator");
primaryStage.setScene(new Scene(root, 770, 410));
primaryStage.setResizable(false);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Это мой главный контроллер. Маленькая записка. Я понимаю, что способ, которым я использую метод "инициализации" моего второго контроллера в моем основном, является неправильным, но я пробовал разные подходы, и они не дали мне лучшего результата
public class Controller implements Initializable {
public static int years = 0;
public static int months = 0;
private double desiredLoan = 1; //should be set to zero,but for testing is set differently
private boolean graph = true; //true - linear, false - annuity
@FXML
private Button Button_3 = new Button();
private LineGraphController lineGraphController = new LineGraphController("Linear");
private AnnuityGraphController annuityGraphController = new AnnuityGraphController("Annuity");
/**Some code to count my data*/
@Override /** This method is used to access my UI elements and access other controllers*/
public void initialize(URL url, ResourceBundle resourceBundle) {
Button_3.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
try {
if (desiredLoan == 0 && months == 0 && years == 0) {
throw new RuntimeException();
}
else {
if (whatGraph() == true) { //make linear graph
lineGraphController.initialize(url, resourceBundle);
}
else {//make annuity graph
annuityGraphController.initialize(url, resourceBundle);
}
}
}
catch (RuntimeException error) {
error.printStackTrace();
}
}
});
}
/** Getters and setters */
public boolean whatGraph() {
return graph;
}
public void setGraph(boolean graph) {
this.graph = graph;
}
}
Мои главные контролеры: Контроллер линейного графика
/** This controller is used to load additional fxml file*/
public class LineGraphController implements Initializable {
@FXML
public LineChart<?, ?> LineGraph;
private String title;
public LineGraphController(String title) {
this.title = title;
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("LineGraph.fxml"));
Parent lineGraph = null;
try {
lineGraph = (Parent)fxmlLoader.load();
} catch (IOException e) {
e.printStackTrace();
}
Stage window = new Stage();
window.initModality(Modality.APPLICATION_MODAL);
window.setTitle(title);
window.setResizable(false);
window.setMinWidth(600);
window.setMinHeight(400);
window.setScene(new Scene(lineGraph));
window.showAndWait();
}
}
Контроллер аннуитетного графика
/** This controller is used to load additional fxml file*/
public class AnnuityGraphController implements Initializable {
@FXML
public LineChart<?, ?> AnnuityGraph;
private String title;
public AnnuityGraphController(String title) {
this.title = title;
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("AnnuityGraph.fxml"));
Parent lineGraph = null;
try {
lineGraph = (Parent)fxmlLoader.load();
} catch (IOException e) {
e.printStackTrace();
}
Stage window = new Stage();
window.initModality(Modality.APPLICATION_MODAL);
window.setTitle(title);
window.setResizable(false);
window.setMinWidth(600);
window.setMinHeight(400);
window.setScene(new Scene(lineGraph));
window.showAndWait();
}
}
Файл My Main F XML.
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: #4a4a4a;" xmlns="http://javafx.com/javafx/10.0.2" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Paskolu_Skaiciuokle.Controller">
<center>
<Button fx:id="Button_3" maxWidth="150.0" mnemonicParsing="false" prefHeight="26.0" prefWidth="100.0" style="-fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.3), 3, 0,5, 5, 5);" text="Show graph" BorderPane.alignment="CENTER">
<font>
<Font name="Times New Roman" size="12.0" />
</font>
</Button>
</center>
</BorderPane>
Мои дополнительные файлы F XML для контроллеров : Линейный график F XML
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="670.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/10.0.2" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Loan_calculator.LineGraphController">
<!-- some code -->
</AnchorPane>
Аннуитетный график F XML
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="670.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/10.0.2" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Loan_calculator.AnnuityGraphController">
<-- some code -->
</AnchorPane>
Заранее благодарим за помощь. ps Это ссылки, по которым я пытался найти решение, было много разных способов, чтобы закодировать это, но я просто не мог найти тот, который мог бы реализовать в своем коде .. или, может быть, мне просто не хватает знаний о том, как сделай это. В любом случае, я надеюсь, что кто-нибудь сможет мне помочь или объяснить, как это исправить. Ссылки: • Передача параметров JavaFX F XML • Как создать несколько контроллеров javafx с разными файлами f xml? • Несколько F XML с контроллерами, общий объект Моя основная проблема - доступ к дополнительным контроллерам с моего основного контроллера. (Все контроллеры связаны с собственными файлами F XML).