我的程序根据来自文本文件的输入,为每个视图动态生成.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");
}
}