Создание классов во время выполнения, загрузка классов и функции Использование в JavaFXML? - PullRequest
0 голосов
/ 19 ноября 2018

Моя программа динамически создает представления .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");
}


}
...