Инъекция FXML в javafx, как она может внезапно обнулиться? - PullRequest
0 голосов
/ 09 июля 2019

когда я отлаживаю, программа hiddenMenu имеет значение, когда достигает метода инициализации.Однако когда я позже создаю Большой Круг и добавляю на него кликвент, я хочу, чтобы скрытое меню было невидимым.

Когда я пробую hiddenMenu.setVisible (false), я получаю nullpointerexception.Я знаю, что ничего не изменил на пути.Я что-то забыл или пропустил?

Я пробовал hiddenMenu.setVisible (false);без успеха.

вот код:

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.

1 Ответ

0 голосов
/ 16 июля 2019

Основная проблема заключалась в том, что я использовал следующий код:

root = FXMLLoader.load(getClass().getResource("../grafik/mainWindow.fxml"));

вместо этого кода:

FXMLLoader loader = new FXMLLoader(getClass().getResource("/grafik/mainWindow.fxml"));
mainWindowRoot = loader.load();

Как только я это исправил, все начало работать!Спасибо за помощь и отзывы, я исправил соответствующие решения для ваших замечаний!

...