JavaFX - 无法从EventHandler中的视图控制器访问变量

时间:2017-12-10 17:14:35

标签: java javafx

我的EventHandler代码看起来像这样:

public EventHandler<MouseEvent> handleMouseClickedEvent = new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent event) {
        // Grab the Pane from the event.
        Pane p = (Pane) event.getSource();

        // Set the colour of that pane.
        String colour = ViewController.brushColourPicker.getValue().toString();
        p.setStyle("-fx-background-color: " + colour);
    }
};
无法从EventHandler中的静态上下文访问

brushColourPicker - 如果我在视图控制器中将变量设为静态,则会获得NPE。我也不能使用getter,因为getter必须是静态的,这会阻止访问我的变量。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

为了从其他类访问控制器的视图元素,可以执行以下操作:

首先,创建一个类来存储您的Controller(s)。

public class Controllers {

        private static MainController mainController;

        public static MainController getMainController() {
            return mainController;
        }

        public static void setMainController(MainController mainController) {
            Controllers.mainController = mainController;
        }

        public static void setMainControllerLoader(FXMLLoader mainControllerLoader) {
            Controllers.mainController = mainControllerLoader.getController();
        }
}

然后,执行以下操作:

public class MainController
{
    // view elements..

    public void initialize()
    {
        Controllers.setMainController(this);
        // ...
    }
}

或者:

        Parent root;
        FXMLLoader loader;
        try {
            loader = new FXMLLoader(getClass().getClassLoader().getResource("path/to/yourFxml.fxml"));
            root = loader.load();
            Controllers.setMainControllerLoader(loader);
        } catch (IOException e) {
            // Failed to load fxml
        }
        Stage stage = new Stage();
        stage.setScene(new Scene(root, 600, 400));

现在,您可以从任何类调用Controllers.getMainController()并访问控制器的视图元素,例如Controllers.getMainController().mainPane.setVisible(false)