嘿,我搜索了一段时间,但我找不到解决以下问题的方法:
在javafx中有3个基本文件;控制器类,fxml文件和应用程序类.现在我想在控制器中做出一个按钮点击(其工作得很好)并更改该点击屏幕(通常使用stage.setScreen()),但我没有参考舞台(你可以在应用程序类中找到).
应用程序示例:
- public class JavaFXApplication4 extends Application {
- @Override
- public void start(Stage stage) throws Exception {
- Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
- Scene scene = new Scene(root);
- stage.setScene(scene);
- stage.show();
- }
- /**
- * The main() method is ignored in correctly deployed JavaFX application.
- * main() serves only as fallback in case the application can not be
- * launched through deployment artifacts,e.g.,in IDEs with limited FX
- * support. NetBeans ignores main().
- *
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- launch(args);
- }
- }
FXML-样品:
- <?xml version="1.0" encoding="UTF-8"?>
- <?import java.lang.*?>
- <?import java.util.*?>
- <?import javafx.scene.*?>
- <?import javafx.scene.control.*?>
- <?import javafx.scene.layout.*?>
- <AnchorPane id="AnchorPane" prefHeight="200.0" prefWidth="320.0" xmlns:fx="http://javafx.com/fxml" fx:controller="javafxapplication4.SampleController">
- <children>
- <Button id="button" fx:id="nextScreen" layoutX="126.0" layoutY="90.0" onAction="#handleButtonAction" text="Next Screen" />
- <Label fx:id="label" layoutX="126.0" layoutY="120.0" minHeight="16.0" minWidth="69.0" />
- </children>
- </AnchorPane>
控制器 – 示例:
- public class SampleController implements Initializable {
- @FXML
- private Label label;
- @FXML
- private void handleButtonAction(ActionEvent event) {
- System.out.println("You clicked me!");
- label.setText("Hello World!");
- //Here I want to swap the screen!
- }
- @Override
- public void initialize(URL url,ResourceBundle rb) {
- // TODO
- }
- }
我会感谢任何一种帮助.
解决方法
- @FXML
- private void handleButtonAction(ActionEvent event) {
- System.out.println("You clicked me!");
- label.setText("Hello World!");
- //Here I want to swap the screen!
- Stage stageTheEventSourceNodeBelongs = (Stage) ((Node)event.getSource()).getScene().getWindow();
- // OR
- Stage stageTheLabelBelongs = (Stage) label.getScene().getWindow();
- // these two of them return the same stage
- // Swap screen
- stage.setScene(new Scene(new Pane()));
- }