javafx中的FXML注入,怎么会突然变为空?
调试程序时,hiddenMenu在到达initialize方法时有一个值。但是,当我稍后创建一个大圆圈并在其上添加clickevent时,我希望hiddenMenu不可见 当我尝试hiddenMenu.setVisible(false)时,我得到一个nullpointerexception。我知道我在路上什么都没变。我是忘了还是错过了什么 我尝试了hiddenMenu.setVisible(false);没有成功 代码如下:javafx中的FXML注入,怎么会突然变为空?,java,javafx,fxml,Java,Javafx,Fxml,调试程序时,hiddenMenu在到达initialize方法时有一个值。但是,当我稍后创建一个大圆圈并在其上添加clickevent时,我希望hiddenMenu不可见 当我尝试hiddenMenu.setVisible(false)时,我得到一个nullpointerexception。我知道我在路上什么都没变。我是忘了还是错过了什么 我尝试了hiddenMenu.setVisible(false);没有成功 代码如下: public class MainWindow extends App
public class MainWindow extends Application implements Initializable {
@FXML
private AnchorPane root;
@FXML
private ComboBox<String> chooseFigureComboBox;
@FXML
private Button btnCreate;
@FXML
private HBox hiddenMenu;
@FXML
private ColorPicker cp;
@FXML
private Label lblColor;
@FXML
private Label lblSize;
@FXML
private Slider sli;
private Shape selected;
private List<Node> selectionList = new LinkedList<>();
private static MainWindow mainWindow;
private FigureHandler figureHandler;
private ObservableList<String> figures;
private ArrayList<Circle>circles;
@Override
public void start(Stage scene) throws Exception{
MainWindow.mainWindow = this;
figureHandler = FigureHandler.getInstance();
figureHandler.setMainWindow(mainWindow);
root = FXMLLoader.load(getClass().getResource("../grafik/mainWindow.fxml"));
scene.setTitle("Hello World");
scene.setScene(new Scene(root, 800, 600));
scene.show();
}
public void addLargeCircle(){
Circle circle = new Circle();
circle.setRadius(100);
circle.setFill(Color.RED);
circle.addEventHandler(MouseEvent.MOUSE_CLICKED,e->{
System.out.println("Ett klick skedde på cirkeln!");
hiddenMenu.setVisible(false);
});
circle.addEventHandler(MouseEvent.MOUSE_DRAGGED,e->{
moveCircle(e,circle);
});
root.getChildren().add(circle);
//circles.add(circle);
//figureHandler.addCircleToList(circle);
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
figures = FXCollections.observableArrayList("small Circle","medium circle","large Circle");
chooseFigureComboBox.setItems(figures);
circles = new ArrayList<>();
cp.setValue(Color.RED);
cp.setOnAction(e->{
System.out.println("Changed color");
});
}
public类主窗口扩展应用程序实现可初始化{
@FXML
隐根;
@FXML
私有组合框选择FigureComboBox;
@FXML
私人按钮创建;
@FXML
私人HBox hiddenMenu;
@FXML
私人色彩采集器;
@FXML
自有品牌lblColor;
@FXML
自有品牌lblSize;
@FXML
私人滑杆;
选择私有形状;
private List selectionList=新建LinkedList();
私有静态主窗口主窗口;
私人小贩小贩;
私人观察者人物;
私人艺术界;
@凌驾
public void start(舞台场景)引发异常{
MainWindow.MainWindow=这个;
figureHandler=figureHandler.getInstance();
figureHandler.setMainWindow(主窗口);
root=FXMLLoader.load(getClass().getResource(“../grafik/mainWindow.fxml”);
场景.setTitle(“你好世界”);
scene.setScene(新场景(root,800600));
scene.show();
}
public void addLargeCircle(){
圆圈=新圆圈();
圆。设定半径(100);
圆形。设置填充(颜色。红色);
圆圈.addEventHandler(MouseEvent.MOUSE_单击,e->{
System.out.println(“Ett-klick skedde påcirklen!”);
hiddenMenu.setVisible(假);
});
圆圈.addEventHandler(MouseEvent.MOUSE_拖动,e->{
移动圆(e,圆);
});
root.getChildren().add(圆);
//圆。添加(圆);
//figureHandler.addCircleToList(圆形);
}
@凌驾
公共void初始化(URL、ResourceBundle、ResourceBundle){
figures=FXCollections.observableArrayList(“小圆圈”、“中圆圈”、“大圆圈”);
选择FigureComboBox.setItems(数字);
圆圈=新的ArrayList();
cp.setValue(颜色为红色);
cp.setOnAction(e->{
System.out.println(“更改颜色”);
});
}
//跳过一些与问题无关的方法
预计不会显示,我得到的是NPE。主要问题是我使用了以下代码:
root = FXMLLoader.load(getClass().getResource("../grafik/mainWindow.fxml"));
而不是此代码:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/grafik/mainWindow.fxml"));
mainWindowRoot = loader.load();
一旦我解决了这个问题,一切都开始工作了!感谢您的帮助和反馈,我已经针对您的评论更正了相应的解决方案!不知道这是否是问题所在,但请注意,调用
start
的main窗口
实例与用于FXML控制器的实例不同。当您指定fx:controller
属性时,fxmloader
将创建控制器类的新实例。将应用程序类用作FXML控制器通常不是一个好主意。没有关于如何调用addLargeCircle
的信息。我假设它位于不同的FXML中,而不是包含的FXML中>HBox
?!旁注:调用舞台场景(舞台场景
)会让人困惑。