javafx窗口来回切换按钮

时间:2018-09-24 09:49:42

标签: java javafx

我遇到一个事实,我在他们各自的java类中都有两个窗格,并且我想要一个按钮来打开页面上的另一个窗格(因此使用一个按钮从一个窗格转到另一个窗格),但是它没有似乎真的没有用。 我刚开始在学校里编码。任何帮助都将是惊人的。

这是我在主类上使用的代码,如果需要,则将其称为panle2.java,并在主目录中使用窗格的窗格名称,在副目录中使用根目录。

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {

        Pane pane = new HBox(10);
        pane.setPadding(new Insets(5, 5, 5, 5));
        Image image = new Image("picachu_pok__mon-logo-D361BD95C6-seeklogo.com.png");
        pane.getChildren().add(new ImageView(image));

        Button button = new Button();
        button.setOnAction(event -> {
            try {
                FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/A.fxml"));
                Parent root1 = (Parent) fxmlLoader.load();
                Stage stage = new Stage();
                stage.setScene(new Scene(root1));
                stage.show();
            } catch(Exception e) {
                e.printStackTrace();
            }
        });
        primaryStage.setTitle("pokemon stats");
        Scene value = new Scene(pane, 1000, 600);
        primaryStage.setScene(value);
        button.setOnAction(event -> {
            value.setRoot(pane);

        });
        ImageView imageView2 = new ImageView(image);
        imageView2.setFitHeight(100);
        imageView2.setFitWidth(100);
        pane.getChildren().add(imageView2);
        pane.getChildren().add(button);

        ImageView imageView3 = new ImageView(image);
        imageView3.setRotate(90);
        pane.getChildren().add(imageView3);


        primaryStage.show();


    }


    public static void main(String[] args) {
        launch(args);
    }
}`

2 个答案:

答案 0 :(得分:0)

您的代码有多个问题。

  1. Pane pane = new HBox(10);->我猜这会导致问题。我在我的代码中尝试了它,并使用root.setAlignment(Pos.CENTER);创建了一个错误。另外,我相信这会对不得不返回并阅读代码的人造成混乱。
  2. 您有一个Button,但是您为Button创建了两个不同的事件处理程序。
  3. 如果您要尝试更改Scene,则第二个Scene需要一个Button,这样您就可以返回第一个Scene。 (此示例未采用这种方法。)

在下面的示例中,我不尝试更改Scene。我只是在索引Nodes的零处切换VBox。这可能是更好的方法。我不确定。我还使用setUserData()来跟踪当前在Node索引零中加载的VBox

  

主要

    import java.io.IOException;
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;

    /**
     *
     * @author blj0011
     */
    public class JavaFXApplication269 extends Application
    {

        @Override
        public void start(Stage primaryStage)
        {
            VBox root = new VBox();
            Scene scene = new Scene(root, 1000, 600);
            Button btnPaneChanger = new Button("Click Me!");

            Label label = new Label("I am Pane 1!");
            StackPane pane1 = new StackPane(label);
            pane1.setPrefSize(1000, 500);
            root.setAlignment(Pos.CENTER);
            root.getChildren().addAll(pane1, btnPaneChanger);//Set the first pane in index zero of the VBox
            btnPaneChanger.setUserData("pane1");//Use setUserData to keep up with which Pane is currently loaded

            btnPaneChanger.setOnAction((event) -> {
                switch (btnPaneChanger.getUserData().toString()) {
                    case "pane1": {
                        try {
                            FXMLLoader listViewLoader = new FXMLLoader(getClass().getResource("pane2.fxml"));
                            StackPane pane2 = ((StackPane) listViewLoader.load());//StackPane is the root node in the FXML
                            root.getChildren().set(0, pane2);
                            btnPaneChanger.setUserData("pane2");
                        }
                        catch (IOException ex) {
                            ex.printStackTrace();
                        }
                    }
                    break;
                    case "pane2":
                        root.getChildren().set(0, pane1);
                        btnPaneChanger.setUserData("pane1");
                        break;
                }

            });

            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.show();
        }

        /**
         * @param args the command line arguments
         */
        public static void main(String[] args)
        {
            launch(args);
        }

    }

>Pane 2 Controller

import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.Initializable;

/**
 * FXML Controller class
 *
 * @author blj0011
 */
public class Pane2Controller implements Initializable
{

    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb)
    {
        // TODO
    }

}
  

Pane 2 FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.text.Font?>

<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxapplication269.Pane2Controller">
   <children>
      <Label text="This is Pane 2">
         <font>
            <Font size="37.0" />
         </font>
      </Label>
   </children>
</StackPane>

答案 1 :(得分:0)

代码中的问题之一是您正在使用(1)代码创建元素,然后使用(2)在另一个窗格中使用fxml。如果您正在使用代码,则只需使用代码。如果您使用的是fxml,则只需使用fxml。

您的初始窗格已通过代码完成。一种选择是:不执行FXML。创建一个扩展任何Pane并执行代码中所有操作的新类。

重新加载已经加载的FXML文件总是会出现错误。

如果要避免当前代码中的错误,则必须确保已加载FXML。不要在setOnAction方法(按钮)上实例化它。

public class Main extends Application {

    static Parent root1;

    {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/A.fxml"));
            root1 = (Parent) fxmlLoader.load();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }


    @Override
    public void start(Stage primaryStage) throws Exception {

        Pane pane = new HBox(10);
        pane.setPadding(new Insets(5, 5, 5, 5));
        Image image = new Image("FXML/Capture.PNG");
        Stage stage = new Stage();
        stage.setScene(new Scene(root1,500,500));

        Button button = new Button("Winner");
        button.setMinWidth(200);

        button.setOnAction(e-> {
           stage.show();
        });

        primaryStage.setTitle("pokemon stats");
        Scene value = new Scene(pane, 1000, 600);
        primaryStage.setWidth(1000);
        primaryStage.setScene(value);

        ImageView imageView2 = new ImageView(image);
        imageView2.setPreserveRatio(true);
        pane.getChildren().add(imageView2);
        pane.getChildren().add(button);

        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}

我没有测试上面的代码。但我希望你能明白。