Моя программа динамически создает представления .fxml и классы контроллеров (.java) для каждого представления при вводе из текстового файла.Он также генерирует входные объекты (ComboBoxes, TextFields и Buttons) для каждого представления на основе того, что он читает.
Поскольку классы создаются и компилируются во время выполнения, мне также необходимо создать функции-обработчики для каждого объекта вводаво время выполнения.
Проблема возникает с ключевым словом onAction в представлениях .fxml.Когда я использую это ключевое слово для связывания функций, его представления больше не отображаются.Другие представления, которые не нуждаются в функциях обработчика, остаются видимыми.
Правильно ли я связываю свой контроллер с каждым представлением?Есть ли другой метод для использования динамически построенных функций из динамически создаваемых классов?
Нужно ли устанавливать 'fx: controller = "view # Controller" "для каждого представления в его файле .fxml?Когда я попытался установить это значение, я больше не мог загружать классы во время выполнения, используя этот метод.
Моя цель - иметь возможность использовать функции для каждой кнопки в каждом классе контроллера.
Мой метод динамической загрузки каждого класса контроллера:
(выдержка из) mainController.java
public Object getClass(Path javaClass, String className){
try{
URL classURL = javaClass.getParent().toFile().toURI().toURL();
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[]{classURL});
Class<?> clazz = Class.forName(className, true, classLoader);
return clazz.newInstance();
}
catch(MalformedURLException e){
e.printStackTrace();
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
catch(IllegalAccessException e ){
e.printStackTrace();
}
catch(InstantiationException e){
e.printStackTrace();
}
return null;
}
view_One.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.control.TextField?>
<BorderPane xmlns:fx="http://javafx.com/fxml/1">
<top>
<Label text="First View"/>
</top>
<center>
<GridPane>
<padding><Insets top="25" right="25" bottom="25" left="25"/></padding>
<Label text="Obj1" GridPane.columnIndex="1" GridPane.rowIndex="0"/>
<TextField id="OneTextField1" GridPane.columnIndex="2" GridPane.rowIndex="0"/>
<Button fx:id="OneButton1" text="Change" GridPane.columnIndex="3" GridPane.rowIndex="0" onAction="#OneButton1Handle"/>
<Label text="Obj2" GridPane.columnIndex="1" GridPane.rowIndex="1"/>
<TextField id="OneTextField2" GridPane.columnIndex="2" GridPane.rowIndex="1"/>
<Button fx:id="OneButton2" text="Change" GridPane.columnIndex="3" GridPane.rowIndex="1" onAction="#OneButton2Handle"/>
<Label text="Obj3" GridPane.columnIndex="1" GridPane.rowIndex="2"/>
<ComboBox id="OneButtonTextField3" GridPane.columnIndex="2" GridPane.rowIndex="2"/>
<Button fx:id="OneButton3" text="Change" GridPane.columnIndex="3" GridPane.rowIndex="2" onAction="#OneButton3Handle"/>
</GridPane>
</center>
</BorderPane>
view_OneController.java
import java.util.ResourceBundle;
import javafx.fxml.Initializable;
import javafx.fxml.FXML;
public class view_OneController {
public void initialize() {
}
@FXML
public void OneButton1Handle(){
OneButton1.setText("Pressed");
}
@FXML
public void OneButton2Handle(){
OneButton2.setText("Pressed");
}
@FXML
public void OneButton3Handle(){
OneButton3.setText("Pressed");
}
}