Java 空FXML变量

Java 空FXML变量,java,javafx,scenebuilder,Java,Javafx,Scenebuilder,通过使用模型视图控制器,我在JavaFXML中有一个应用程序。我想用键盘移动一些滑块。为了在主课堂上做到这一点,我在键盘上放置了一个KeyEvent来听发生了什么。在控制器类FXMLDocumentController中,其中是FXML变量。这些变量被传递给第三个类。当您单击任何滑块时,这些滑块将被更改 问题是,当我传递第三个类中滑块的变量时,它们被完美地存储了起来,但是当您运行代码来修改单击时经过主类的滑块时,它们的FXML变量为null 这里有代码: 主要类别: public class O

通过使用模型视图控制器,我在JavaFXML中有一个应用程序。我想用键盘移动一些滑块。为了在主课堂上做到这一点,我在键盘上放置了一个KeyEvent来听发生了什么。在控制器类FXMLDocumentController中,其中是FXML变量。这些变量被传递给第三个类。当您单击任何滑块时,这些滑块将被更改

问题是,当我传递第三个类中滑块的变量时,它们被完美地存储了起来,但是当您运行代码来修改单击时经过主类的滑块时,它们的FXML变量为null

这里有代码:

主要类别:

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()
to
FXMLDocumentController=new FXMLDocumentController()。应用程序加载良好,但最初的问题仍然存在,sldier变量为空。@user3203690,现在它应该可以工作了(我错误地使用了
fxmloader
的静态
load
方法)@James\u D,再次查看。
load
方法的参数现在是
InputStream
。是的,对不起,没有滚动:)。