javafx中的FXML注入,怎么突然变成null了?
FXML injection in javafx, how can it turn null suddenly?
当我调试程序时,hiddenMenu 在到达初始化方法时有一个值。但是,当我稍后创建一个大圆圈并在其上添加一个 clickevent 时,我希望 hiddenMenu 不可见。
当我尝试 hiddenMenu.setVisible(false) 时,我得到一个 nullpointerexception。我知道我在路上没有改变任何东西。我是不是忘记或遗漏了什么?
我试过了hiddenMenu.setVisible(假);没有成功。
代码如下:
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");
});
}
//跳过一些与问题无关的方法
预计它不会显示,我得到的是 NPE。
主要问题是我使用了以下代码:
root = FXMLLoader.load(getClass().getResource("../grafik/mainWindow.fxml"));
代替此代码:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/grafik/mainWindow.fxml"));
mainWindowRoot = loader.load();
一旦我解决了这个问题,一切就开始工作了!感谢您的帮助和反馈,我已将您的言论更正为适当的解决方案!
当我调试程序时,hiddenMenu 在到达初始化方法时有一个值。但是,当我稍后创建一个大圆圈并在其上添加一个 clickevent 时,我希望 hiddenMenu 不可见。
当我尝试 hiddenMenu.setVisible(false) 时,我得到一个 nullpointerexception。我知道我在路上没有改变任何东西。我是不是忘记或遗漏了什么?
我试过了hiddenMenu.setVisible(假);没有成功。
代码如下:
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");
});
}
//跳过一些与问题无关的方法
预计它不会显示,我得到的是 NPE。
主要问题是我使用了以下代码:
root = FXMLLoader.load(getClass().getResource("../grafik/mainWindow.fxml"));
代替此代码:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/grafik/mainWindow.fxml"));
mainWindowRoot = loader.load();
一旦我解决了这个问题,一切就开始工作了!感谢您的帮助和反馈,我已将您的言论更正为适当的解决方案!