Java 空FXML变量
通过使用模型视图控制器,我在JavaFXML中有一个应用程序。我想用键盘移动一些滑块。为了在主课堂上做到这一点,我在键盘上放置了一个KeyEvent来听发生了什么。在控制器类FXMLDocumentController中,其中是FXML变量。这些变量被传递给第三个类。当您单击任何滑块时,这些滑块将被更改 问题是,当我传递第三个类中滑块的变量时,它们被完美地存储了起来,但是当您运行代码来修改单击时经过主类的滑块时,它们的FXML变量为null 这里有代码: 主要类别:Java 空FXML变量,java,javafx,scenebuilder,Java,Javafx,Scenebuilder,通过使用模型视图控制器,我在JavaFXML中有一个应用程序。我想用键盘移动一些滑块。为了在主课堂上做到这一点,我在键盘上放置了一个KeyEvent来听发生了什么。在控制器类FXMLDocumentController中,其中是FXML变量。这些变量被传递给第三个类。当您单击任何滑块时,这些滑块将被更改 问题是,当我传递第三个类中滑块的变量时,它们被完美地存储了起来,但是当您运行代码来修改单击时经过主类的滑块时,它们的FXML变量为null 这里有代码: 主要类别: public class O
public class OpenPilot extends Application {
Movements Movements = new Movements();
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent Key) {
Movements.GetKeys(Key);
}
});
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
运动:
public class Movements {
//Define Data Variables
public double SpeedValue;
public double TurnsValue;
//Define GUI Variables
private Slider SpeedSlider;
private Slider TurnsSlider;
public void GetSliders(Slider SpeedSlider, Slider TurnsSlider) {
this.SpeedSlider = SpeedSlider;
this.TurnsSlider = TurnsSlider;
}
//Get Sliders
public void GetKeys(KeyEvent Key) {
System.out.println(Key.getCode());
System.out.println(SpeedSlider);
Platform.runLater(new Runnable() {
@Override public void run() {
TurnsSlider.setValue(10);
}
});
}
}
您使用了移动
类的两个不同实例(Movements Movements=new Movements();
在OpenPilot
和FXMLDocumentController
)。由于不使用静态字段/方法,因此无法从一个实例到另一个实例获取任何数据。您必须从控制器获取移动
对象:
public class FXMLDocumentController implements Initializable {
Movements Movements = new Movements();
@FXML public Slider SpeedSlider;
@FXML public Slider TurnsSlider;
@Override
public void initialize(URL url, ResourceBundle rb) {
//Send GUI Information
Movements.GetSliders(SpeedSlider, TurnsSlider);
}
}
控制器:
public class FXMLDocumentController implements Initializable {
Movements movements = new Movements();
public Movements getMovements() {
return movements;
}
@FXML public Slider SpeedSlider;
@FXML public Slider TurnsSlider;
@Override
public void initialize(URL url, ResourceBundle rb) {
//Send GUI Information
movements.GetSliders(SpeedSlider, TurnsSlider);
}
}
public class OpenPilot extends Application {
Movements movements;
@Override
public void start(Stage stage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader();
// use non-static load method here
Parent root = fxmlLoader.load(getClass().getResource("FXMLDocument.fxml").openStream());
// get movements from via controller
FXMLDocumentController controller = fxmlLoader.<FXMLDocumentController>getController();
movements = controller.getMovements();
Scene scene = new Scene(root);
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent Key) {
movements.GetKeys(Key);
}
});
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
使用FXMLLoader
的实例而不是静态方法从控制器获取移动字段:
public class FXMLDocumentController implements Initializable {
Movements Movements = new Movements();
@FXML public Slider SpeedSlider;
@FXML public Slider TurnsSlider;
@Override
public void initialize(URL url, ResourceBundle rb) {
//Send GUI Information
Movements.GetSliders(SpeedSlider, TurnsSlider);
}
}
主类:
public class FXMLDocumentController implements Initializable {
Movements movements = new Movements();
public Movements getMovements() {
return movements;
}
@FXML public Slider SpeedSlider;
@FXML public Slider TurnsSlider;
@Override
public void initialize(URL url, ResourceBundle rb) {
//Send GUI Information
movements.GetSliders(SpeedSlider, TurnsSlider);
}
}
public class OpenPilot extends Application {
Movements movements;
@Override
public void start(Stage stage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader();
// use non-static load method here
Parent root = fxmlLoader.load(getClass().getResource("FXMLDocument.fxml").openStream());
// get movements from via controller
FXMLDocumentController controller = fxmlLoader.<FXMLDocumentController>getController();
movements = controller.getMovements();
Scene scene = new Scene(root);
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent Key) {
movements.GetKeys(Key);
}
});
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
公共类OpenPilot扩展应用程序{
运动;
@凌驾
public void start(Stage)引发异常{
FXMLLoader FXMLLoader=新的FXMLLoader();
//此处使用非静载荷法
父根=fxmloader.load(getClass().getResource(“FXMLDocument.fxml”).openStream());
//通过控制器获取运动信息
FXMLDocumentController控制器=fxmlLoader.getController();
movements=controller.getMovements();
场景=新场景(根);
scene.setOnKeyPressed(新的EventHandler(){
@凌驾
公共无效句柄(KeyEvent密钥){
动作。获取键(键);
}
});
舞台场景;
stage.show();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
发射(args);
}
}
在应用程序启动方法中启动异常时返回错误
java.lang.reflect.InvocationTargetException
。问题在这里:XMLDocumentController=fxmlLoader.getController()代码>或此处movements=controller.getMovements()代码>我尝试更改FXMLDocumentController=(FXMLDocumentController)fxmloader.getController()
toFXMLDocumentController=new FXMLDocumentController()代码>。应用程序加载良好,但最初的问题仍然存在,sldier变量为空。@user3203690,现在它应该可以工作了(我错误地使用了fxmloader
的静态load
方法)@James\u D,再次查看。load
方法的参数现在是InputStream
。是的,对不起,没有滚动:)。