Прежде чем мы начнем, это не дубликат.Если вы думаете, что это, пожалуйста, ссылку решение.Я новичок в 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!