Как исправить «Null PointerException» при изменении цвета заливки узла на KeyPressed - PullRequest
0 голосов
/ 24 сентября 2019

Прежде чем мы начнем, это не дубликат.Если вы думаете, что это, пожалуйста, ссылку решение.Я новичок в Java и JavaFX.

Как видно из названия, при нажатии keycode.A я хочу изменить цвет узла дуги.

Main.Java

public class Main extends Application {


@Override
public void start(Stage primaryStage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("/sample/menu.fxml"));
    Scene scene = new Scene(root, 700, 400);

    primaryStage.setScene(scene);
    primaryStage.show();


}

MenuController

public class MenuController implements Initializable{

@FXML
private StackPane parentContainer;
@FXML
private AnchorPane anchorRoot;
@FXML
private Button btnGo;

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {

}

@FXML
private void keyFrameAnimation(MouseEvent mouseEvent) throws IOException {

    Parent root2 = FXMLLoader.load(getClass().getResource("/sample/maingame.fxml"));
    Scene scene = btnGo.getScene();
    root2.translateXProperty().set(scene.getWidth());
    parentContainer.getChildren().add(root2);

    Timeline timeLine = new Timeline();
    KeyValue kv = new KeyValue(root2.translateXProperty(), 0, Interpolator.EASE_IN);
    KeyFrame kf = new KeyFrame(Duration.seconds(1), kv);
    timeLine.getKeyFrames().add(kf);
    timeLine.setOnFinished(event -> {
        parentContainer.getChildren().remove(anchorRoot);
    });
    timeLine.play();

}

}

GameController

public class GameController implements Initializable {

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {

}

@FXML
private Arc arc;

@FXML
private void controlArc(KeyEvent event) throws IOException{
    Scene scene = arc.getScene();
    scene.setOnKeyPressed(ke -> {
        if (ke.getCode() == KeyCode.A) {
            arc.setFill(Color.BLUE);

        }
    });
}

FXML

menu.fxml

<StackPane fx:id="parentContainer" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.MenuController">
   <children>
      <AnchorPane fx:id="anchorRoot" prefHeight="400.0" prefWidth="381.0">
         <children>
            <Button fx:id="btnGo" layoutX="425.0" layoutY="167.0" mnemonicParsing="false" onMouseClicked="#keyFrameAnimation" text="Button" />
         </children>
      </AnchorPane>
   </children>
</StackPane>

maingame.fxml

<AnchorPane fx:id="anchorRoot2" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"  prefHeight="400.0" prefWidth="700.0" style="-fx-background-color: black;" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.GameController">

<children>
   <Arc fx:id="arc" fill="#fff91f" layoutX="312.0" layoutY="170.0" length="270.0" "radiusX="21.0" radiusY="18.0" startAngle="45.0" stroke="BLACK" strokeType="INSIDE" type="ROUND" />
</children>
</AnchorPane>

Когда метод setOnKeyPressed() запускается из метода KeyFrameAnimation(), печатается код ключа.Тем не менее, он дает nullPointerException при попытке изменить цвет дуги.

Когда метод setOnKeyPressed() запускается из GameController, как в приведенном выше коде, ничего не происходит.

Я думаю, может быть, это потому, что я не загружаю GameController?или я далеко?

TIA!

1 Ответ

3 голосов
/ 24 сентября 2019

В этом вопросе нужно учесть несколько моментов: во-первых, в maingame.fxml

length="270.0" "radiusX="21.0"

есть ошибка опечатки, которая является дополнительной " непосредственно перед radiusX. Не уверенисправили ли вы это.

Во-вторых, нам было бы более понятно, если бы вы предоставили трассировку стека NullPointerException, чтобы выяснить, где это происходит.

В-третьих, кто вызывает метод controlArc ()в GameController.java? На данный момент я не могу найти какой-либо код, вызывающий этот метод.

Наконец, чтобы он работал, вам нужно переместить код из метода controlArc () в метод initialize ().как

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    Scene scene = arc.getScene();
    scene.setOnKeyPressed(ke -> {
        if (ke.getCode() == KeyCode.A) {
            arc.setFill(Color.BLUE);

        }
    });
}

На этом этапе вы столкнетесь с NullPointerException, так как сцена будет нулевым в методе инициализации. Чтобы исправить это, код должен быть изменен на ..

public class GameController implements Initializable {

    @FXML
    private Arc arc;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        // Adding events to scene once it is loaded.
        arc.sceneProperty().addListener((obs, old, scene) -> {
            scene.setOnKeyPressed(ke -> {
                if (ke.getCode() == KeyCode.A) {
                    arc.setFill(Color.BLUE);
                }
            });
        });
    }
}
...