运行时类构建,类加载和函数是否在JavaFXML中使用?

时间:2018-11-19 17:29:19

标签: java fxml

我的程序根据来自文本文件的输入,为每个视图动态生成.fxml视图和控制器类(.java)。它还根据读取的视图为每个视图生成输入对象(组合框,文本字段和按钮)。

由于这些类是在运行时构建和编译的,因此我还需要在运行时为每个输入对象创建处理函数。

.fxml视图中的'onAction'关键字出现问题。当我使用此关键字链接功能时,不再影响它的视图。其他不需要处理程序功能的视图仍然可见。

我没有正确地将控制器链接到每个视图吗?是否存在另一种使用动态构建类中的动态构建函数的方法?

我是否需要为.fxml文件中的每个视图设置'fx:controller =“ view#Controller”'?当我尝试设置此值时,我不再能够使用此方法在运行时加载类。

我的目标是能够使用每个控制器类中每个按钮的功能。

我动态加载每个控制器类的方法:

(摘录)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");
}


}

0 个答案:

没有答案