我通过使用模型视图控制器在JavaFX FXML中有一个应用程序。我想用键盘移动一些滑块。为此,我在主类中放置了一个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 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 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类的2个不同实例(Movements Movements = new Movements();OpenPilot中的FXMLDocumentController)。由于您不使用静态字段/方法,因此不会从一个实例到另一个实例获取任何数据。您必须从控制器获取Movements对象:

控制器:

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);
    }

}


使用FXMLLoader的实例而不是静态方法来从控制器获取Movements字段:

主班:

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);
    }

}

关于java - 空FXML变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23171753/

10-10 07:26